2017-04-07 4 views
0

J'ai un conteneur contenant un vecteur d'objets.C++ - pointeur de retour ou référence const

class Container 
{ 
    vector<Foo> objects; 

Je veux

  • accès en lecture seule à ces objets en tant que l'appelant
  • Évitez d'appeler le constructeur de copie
  • Ignorer le problème de l'accès à ces objets après que le récipient est hors de portée (cela n'arrivera jamais)

Basé sur cela, il semble que j'ai 2 choix pour le ge méthode de tter. Soit revenir référence const à un vecteur, ou retourner un pointeur vers vecteur const

const vector<Foo> & getRef() { return objects; } 
const vector<Foo> * getPtr() { return &objects; } 

Bien sûr, si je suis l'appelant, je dois vous assurer d'appeler pas constructeur de copie quand j'itérer. Donc je cette

for (const Foo & f : getRef()) 

et non

for (Foo f : getRef()) 

Maintenant, dois-je retourner référence const? ou un pointeur vers const? Quels sont les avantages et les inconvénients?

+2

Habituellement les pointeurs sont utilisés quand ce que vous retournez peut être nul, mais dans ce cas c'est un vecteur donc il ne peut pas vraiment être nul .. J'irais avec le const-ref – AlexG

+0

Votre 3ème choix, imho toujours mieux, est pour amener la fonction (qui appelle le getter et utilise la référence) dans le conteneur - donc aucun getter nécessaire. Voir encapsulation: (du wiki) "Une construction de langage qui facilite le regroupement des données avec les méthodes (ou d'autres fonctions) fonctionnant sur ces données." –

Répondre

2

Une référence est plus robuste. Vous ne pouvez pas appeler accidentellement le supprimer.