2015-09-15 1 views
1

J'essaie d'écrire du code orienté objet politiquement correct qui comprend cinq classes, dont certaines ont besoin de manipuler un vecteur privé dans l'un des Des classes. Je n'ai pas réussi à essayer de faire des fonctions d'amis en raison de références circulaires, et je me promenais s'il y avait de meilleurs moyens. Le vecteur est très grand (1 million) et je fais environ 100 000 itérations, ce qui me semble inefficace.C++: Comment retourner efficacement un vecteur privé de 1million à plusieurs autres classes avec le bon OO

Un squelette de mon code est:

class A{ 
    func(){use a} 
    private: 
     vector<double> a; 
    }; 

    class B{ 
    func(){use a and manipulate b}; 
    ... 
    private: 
    double *b; 
    }; 

class C{ 
    ... 
    func(){use a} 
    func(){use b} 
}; 

main(){ 
for(j=0; j<500000;j++){ 
    A a1; 
    a1.func(); 
    .... 
    B b1; 
    C c1; 
    b1.func(); 
    c1.func(); 
    .... 
} 
} 

Ces classes ont une relation "a-un" donc je ne peux pas utiliser l'héritage. J'ai finalement l'intention de mettre les déclarations en main dans une autre classe avec une relation "has-a".

Merci

+6

Définir 'code orienté objet politiquement correct'. – user2079303

+0

Quelque chose qu'un employeur ne désapprouverait pas. J'essaie de trouver un moyen efficace d'accéder au vecteur privé qui correspond à l'encapsulation. Cependant, je me suis demandé s'il ne serait pas mieux de déclarer le vecteur public. –

Répondre

4

Vous pouvez avoir une méthode dans la classe A qui renvoie une référence au vecteur:

class A { 
    public: 
    vector<double>& getVector() { return a; } 
    ... 

ou

const vector<double>& getVector() const { return a; } 

si les utilisateurs du vecteur ne modifient pas .

Renvoyer une référence à un objet privé n'est pas mauvais tant que cela est justifié par la conception de la classe. Grosso modo, si le fait qu'il existe une valeur de retour de vecteur n'est pas un détail de mise en œuvre de la classe A, mais quelque chose d'autres utilisateurs de A devrait vraiment être au courant.

+0

Dans ce cas, on pourrait aussi bien en faire un membre public. – juanchopanza

+0

@juanchopanza, pas exactement, ayant une fonction getter vous donne (un peu) plus de flexibilité. Par exemple, vous pourriez avoir _two_ tableaux et renvoyer une référence à l'un d'eux en fonction de certaines conditions. Ou vous pourriez décider de refactoriser la classe 'A' et déplacer le tableau dans une autre classe, qui sera incluse dans' A' en tant que membre, etc. – Petr

+0

Merci pour les suggestions. Je me demandais si cela pourrait être un cas particulier où le fait d'être un membre du public pourrait avoir du sens, mais j'aime l'idée de renvoyer une référence puisque le membre reste privé. –