Domanda

qual è il modo migliore per inserire una classe contenitore o un'altra classe all'interno di una classe come membro privato o pubblico?

Requisiti:

1.Vector<someclass> all'interno della mia classe

2.È necessaria l'aggiunta e il conteggio del vettore

È stato utile?

Soluzione

Se lo stato del contenitore fa parte dell'invariante della classe, dovrebbe, se possibile, essere privato.

Ad esempio, se il contenitore rappresenta un vettore tridimensionale, parte dell'invariante potrebbe essere che contiene sempre esattamente 3 numeri. Esporlo come membro pubblico consentirebbe al codice esterno alla classe di modificare le dimensioni dei contenitori, il che a sua volta potrebbe causare problemi per qualsiasi routine che richiede che le dimensioni del contenitore siano costanti. Mantenere privato il contenitore limita le posizioni nel software in cui è possibile modificare le dimensioni del contenitore in base alle funzioni del membro della classe.

Altri suggerimenti

Il fatto che un membro sia dichiarato privato o pubblico dipende interamente dalla tua applicazione. Potresti dare qualche dettaglio in più?

Un punto importante da ricordare quando si dichiara il proprio membro è che se si fornisce un " getter " per recuperarlo, non si incapsula più quell'oggetto. Invece, può essere utile scrivere metodi wrapper esponendo solo le funzionalità che si desidera esporre.

Ad esempio, con un membro Vector, potresti scrivere un metodo AddItem e Clear, se questa è tutta la funzionalità che desideri esporre.

Dato che stai parlando di un corso, penso che dovrebbe essere privato. Se vuoi che sia pubblico, piuttosto crea una struttura - per rendere ovvio che vuoi usare le variabili membri .

Un'alternativa praticabile all'esposizione del membro vector sta creando una funzione visitatore (o un iteratore interno). In questo modo obbedisci meglio alla legge di Demetra:

class ContWrapper {
    std::vector<int> _ints;
public:
    class Action {
    public: 
        virtual void accept( int i ) = 0;
    };
    void each_int( Action& a );
};

Fai anche molta attenzione quando esporti un std::vector<T> anche da una libreria: il codice client potrebbe non utilizzare la stessa implementazione STL come hai fatto tu, quindi il layout di queste variabili membro potrebbe essere diverso!

Rendi privati ​​tutti i membri e utilizza metodi di accesso, ciò ti consente di modificare l'implementazione in un secondo momento.Solo in circostanze molto insolite renderei pubblico qualsiasi membro dei dati.

Ricorda che cambiare l'implementazione avviene più spesso di quanto potresti immaginare, non si tratta solo di cambiare il tipo di contenitore ma forse vuoi cambiare il meccanismo.Supponiamo che tu stia memorizzando nomi in un elenco, dopo un po' potresti scegliere di indicizzare questo elenco con un hash e vorresti che l'hash fosse aggiornato ogni volta che aggiungi un nuovo nome.Se la tua implementazione è opportunamente incapsulata, farlo è facile, se hai appena esposto il vettore dovresti apportare modifiche che adatteranno l'interfaccia (e quindi la modifica si diffonderà).

Se questo è nuovo, hai letto: http://en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)

C'è un terzo modo: a volte è meglio ereditare dal contenitore e sovrascrivere i suoi metodi per raggiungere il tuo obiettivo (ad esempio la sicurezza del thread). Ad ogni modo, renderlo pubblico quasi sempre non è una buona idea.

Considerando che vuoi incapsulare il contenitore all'interno di un'altra classe implica che non può essere pubblico, e anche i metodi pubblici della tua classe non dovrebbero esporre nulla di specifico dell'implementazione sul contenitore. In questo modo l'implementazione della tua classe (cioè il container) può essere cambiata senza cambiare la sua interfaccia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top