2017-08-03 1 views
1

J'ai deux classes (A & B) avec une structure similaire, qui contiennent toutes deux un vecteur de structures.Accéder au vecteur membre privé de plusieurs objets dans l'autre classe

class A/B{ 
private: std::vector<DataStruct> vec_A/vec_B; 
... 
public: 
... 
} 

Pour créer/mettre à jour un objet de B, je dois combiner les données à partir des vecteurs de multiples objets de la classe A (combinant des entrées similaires dans le vecteur dans une entrée dans le vecteur de l'objet B et faire des données transformations en B).

Comment procéder?

Mes pensées étaient:

  • Making classe B à un ami de A. Mais j'ai entendu, que des cours de fabrication amis en C++ est seulement le dernier recours et doit être évité.
  • Ecriture d'une fonction getVector() dans la classe A, qui renvoie une référence au vecteur vec_A, afin que la classe B puisse fonctionner sur les données. Pour moi, cela semble simplement contourner l'encapsulation des données. Quel serait l'avantage de mettre le vecteur en public?
  • Ecriture d'une fonction getVector() dans la classe A, qui renvoie une copie de vec_A. Mais comme vec_A n'est pas si petit, cela semble être inefficace (ok, seulement quelques Ko. Devrait fonctionner mais en général ...)
  • Ecrire une fonction pour la classe A, qui fait le calcul et crée un objet de classe B. Puis concaténer plusieurs objets de B dans un objet final de B. Cependant, cela semble être beaucoup de frais généraux pour moi.
+1

avez-vous envisagé de donner à B une référence constante de 'vec_A'? – Xatyrian

+0

@Xatyrian non, mais cela semble être une bonne idée – Jounathaen

Répondre

1

écriture d'une fonction getVector() en classe A, qui renvoie une référence à l' Vector vec_A, de sorte que la classe B peut fonctionner sur les données. Pour moi cela semble simplement contourner l'encapsulation de données. Quel serait l'avantage pour mettre le vecteur en public?

Si B a juste besoin d'observer le contenu de vec_A, envisager de revenir un const référence (const &):

class A { 
... 
    public: 

    // Give read-only access to vec_A 
    const std::vector<DataStruct> & getVector() const { 
     return vec_A; 
    } 
}; 

Je préfère cette solution pour faire juste le public membre de données vectorielles: avec accesseurs (getter/setter) vous avez un meilleur contrôle. Par exemple, vous pouvez implémenter un accès en lecture seule (comme illustré ci-dessus). Ou, si vous voulez fournir un setter, vous pouvez également implémenter une vérification sur l'argument d'entrée, etc.