Question

Quel est le meilleur moyen de placer une classe conteneur ou une autre classe dans une classe en tant que membre privé ou public?

Conditions requises:

1.Vecteur < someclass > dans ma classe

2.Ajouter et le nombre de vecteur est une interface nécessaire

Était-ce utile?

La solution

Si l'état du conteneur fait partie de l'invariant de la classe, il doit alors, si possible, être privé.

Par exemple, si le conteneur représente un vecteur tridimensionnel, l’invariant pourrait faire partie du fait qu’il contient toujours exactement 3 nombres. L'exposer en tant que membre public permettrait au code externe à la classe de modifier la taille des conteneurs, ce qui pourrait entraîner des problèmes pour toute routine nécessitant une taille constante du conteneur. Garder le conteneur privé limite les endroits de votre logiciel où la taille du conteneur peut être modifiée pour les fonctions membres de la classe.

Autres conseils

Le fait qu'un membre soit déclaré privé ou public dépend entièrement de votre application. Pourriez-vous donner plus de détails?

Un point important à retenir lors de la déclaration de votre membre est que si vous fournissez un & "getter &"; pour le récupérer, vous n'encapsulez plus cet objet. Au lieu de cela, il peut être intéressant d’écrire des méthodes de wrapper n’exposant que les fonctionnalités que vous souhaitez exposer.

Par exemple, avec un membre Vector, vous pouvez écrire une méthode AddItem and Clear, si toutes les fonctionnalités que vous souhaitez exposer sont

.

Puisque vous parlez d’un cours, je pense qu’il devrait être privé. Si vous voulez que ce soit public, créez plutôt une structure - pour indiquer clairement que vous voulez que les variables membres soient utilisées.

Une alternative viable à l’exposition du membre vector est la création d’une fonction visiteur (ou d’un itérateur interne). De cette façon, vous obéissez mieux à la loi de Demeter:

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

Faites également très attention lorsque vous exportez, par exemple. un std::vector<T> d'une bibliothèque également: le code client peut ne pas utiliser la même implémentation STL que vous, de sorte que la disposition de ces variables membres peut être différente!

Rendre tous les membres privés et utiliser des méthodes d'accès, cela vous permet de modifier l'implémentation ultérieurement. Je rendrais public tout membre de données uniquement dans des circonstances très inhabituelles.

N'oubliez pas que la modification de l'implémentation se produit plus souvent que vous ne l'imaginez, il ne s'agit pas simplement de changer le type du conteneur, mais peut-être souhaitez-vous changer le mécanisme. Supposons que vous stockiez des noms dans une liste. Après un certain temps, vous pourrez choisir d'indexer cette liste avec un hachage et souhaiteriez que le hachage soit mis à jour chaque fois que vous ajoutez un nouveau nom. Si votre implémentation est correctement encapsulée, cela est facile, si vous venez d’exposer le vecteur, vous devrez apporter des modifications qui ajusteront l’interface (pour que les modifications se répercutent).

S'il s'agit d'une nouveauté nouvelle, vous avez lu: http: // en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)

Il existe un troisième moyen: il est parfois préférable d’hériter du conteneur et de remplacer ses méthodes pour atteindre votre objectif (par exemple, la sécurité des threads). Quoi qu'il en soit, le rendre public presque toujours n'est pas une bonne idée.

Considérer que vous souhaitez encapsuler le conteneur dans une autre classe implique qu'il ne peut pas être public et que les méthodes publiques de votre classe ne doivent pas exposer quoi que ce soit de spécifique à l'implémentation du conteneur. De cette façon, l’implémentation de votre classe (le conteneur) peut être modifiée sans changer d’interface.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top