2010-04-17 4 views
2

J'ai une classe qui a un vecteur d'objets. Que dois-je faire pour retourner un de ces objets et le changer en dehors de la classe, en gardant les changements? Est-il possible de faire avec des pointeurs réguliers? Y a-t-il une procédure standard? Si le vecteur contient des pointeurs sur des objets, tout changement à l'un des objets renvoyés par le vecteur (ou plus précisément à l'objet pointé) affectera également l'instance à l'intérieur du vecteur. (Objet de retour C++

+0

Faites-vous référence au vecteur stl? S'il vous plaît fournir un pseudo code exemple de ce que vous voulez. – sramij

Répondre

0

Si vous avez std :: vector où A est votre classe, vous pouvez retourner un std :: vector :: iterator.

class A { 
    public: int a; 
}; 

std::vector<A> v = ...; 
std::vector<A>::iterator it = v.begin(); // access to the first element 
it = v.begin() + 5; // access to the 5-th element (vector can do random access) 
// 'it' can now be used elsewhere 
it->a = 0; // changes are reflected in the object inside the vector 
*it = A(); // changes the object hold by the vector 

Attention, les itérateurs peuvent être invalidés si le vecteur change!

1

) .

4

Votre question est un peu vague, mais voici un exemple:

class foo 
{ 
public: 
    foo() 
    { 
     vec.resize(100); 
    } 

    // normally would be operator[] 
    int& get(size_t pIndex) 
    { // the return type is a reference. think of it as an alias 
     return vec[pIndex]; // now the return value is an alias to this value 
    } 

private: 
    std::vector<int> vec; 
}; 

foo f; 
f.get(10) = 5; 
// f.get(10) returned an alias to f.vec[10], so this is equivalent to 
// f.vec[10] = 5 

La FAQ a une belle section on references. En outre, si vous êtes novice en C++, n'essayez pas d'apprendre avec des ressources en ligne. Si vous n'avez pas de livre, you should, ils sont vraiment le seul bon moyen d'apprendre la langue.

+0

+1, mais vous souhaiterez peut-être afficher la déclaration de vec pour plus de clarté. – Cam

+0

@incrediman: C'est dans la section privée de la classe, à moins que je ne sois mal compris. – GManNickG

+2

Vous devez souligner les détails sur le renvoi d'une référence. Pour quelqu'un de nouveau à la langue, il ne peut pas évident que c'est la "magie" ici. –

0

Vous devez retourner une référence ou un pointeur à l'objet.

type &getref(); // "type &" is a reference 
type *getptr(); // "type *" is a pointer 

L'appelant aura alors accès à l'objet sous-jacent.

Mais vous devez ensuite vous assurer que l'objet ne bouge pas (ce qui peut être le cas si un vecteur doit croître). Vous voudrez peut-être penser à utiliser une liste std :: à la place.