2017-07-11 2 views
1

WRT sous le code, Abc & Xyz sont 2 classes.Obtenir une référence dans une fonction de membre de classe et l'affecter à un membre de données de classe (référence) en C++

Je reçois une référence dans DoOperation (Xyz & temp) et je veux l'assigner à un membre de données de classe ie mem1, de sorte que cette référence puisse être utilisée par d'autres fonctions membres DOOperation_2(), DOOperation_3() etc.

Je sais que nous ne pouvons pas déclarer une référence en C++ sans initialisation. Mais comment gérer un tel scénario en C++?

class Abc 
{ 
public: 
    Xyz& mem; //ILLEGAL IN C++ 
    void DoOperation(Xyz& temp) 
    { 
     mem = temp; 
    } 
    void DOOperation_2() 
    { 

    } 
    DOOperation_3() 
    { 

    } 


}; 
+0

Vous avez 2 fautes d'orthographe dans votre code 'Xyz' vs' xYZ' et 'mem1' vs' mem'. – mch

+0

1) Passer la référence au constructeur de classe: 'Abc (Xyz & xyz): mem1 (xyz) {...}' 2) Utiliser un pointeur (ou un pointeur intelligent comme 'std :: unique_ptr') au lieu d'une référence. – 0x5453

+1

C'est un code valide, * si * vous avez un constructeur de 'Abc' qui initialise la référence pour référencer réellement une instance réelle de' Xyz'. * Cependant * alors l'affectation dans 'DoOperation' ne réattribue pas réellement la référence parce que ce n'est pas possible, à la place elle fait' mem1.operator = (temp) ' –

Répondre

1

C'est simple: utilisez un pointeur. Contrairement aux références, les pointeurs sont assignables.

class Abc 
{ 
public: 
    Xyz* mem1; 
    void DoOperation(Xyz& temp) 
    { 
     mem1 = &temp; 
    } 
}; 
1

Comme vous noté à juste titre, vous besoin d'initialiser la référence. Vous aussi ne peut pas changer à quoi une référence "pointe" après qu'il a été initialisé.

Ainsi, la solution simple ici est de simplement utiliser un pointeur

class Abc { 
public: 
    Xyz* mem1{nullptr}; 
    void DoOperation(Xyz* ptr) { 
     mem1 = ptr; 
    } 
}; 

Et puis vous pouvez utiliser mem1 plus tard dans une méthode comme celui-ci (avec une belle assert)

void Abc::SomeMethod() { 
    assert(this->mem1); 
    mem1->something(); 
} 

Notez qu'une référence est très similaire à T* const (pointeur const). Les principales différences sont décrites bien dans cette réponse Difference between const. pointer and reference?


Si vous devez absolument utiliser une référence, la seule chose que vous pouvez faire est d'initialiser une référence dans un constructeur lors de l'initialisation.

class Abc { 
public: 
    Xyz& mem1; 
    Abc(Xyz& mem1_in) : mem1{mem1_in} {} 
}; 
1

lsinitialisez dans le constructeur:

class Abc 
{ 
public: 
    Xyz& mem1; 
    Abc (xYZ& temp) : mem1(temp) {} 
// ... 
}; 

ou utiliser un pointeur:

class Abc 
{ 
public: 
    Xyz* mem = nullptr; 

    void DoOperation(xYZ& temp) 
    { 
     mem = &temp; 
    } 
// ... 
}; 
1

Utilisez un pointeur à la place.

class Abc 
{ 
public: 
    Xyz* mem1; // pointer 
    void DoOperation(xYZ& temp) 
    { 
     mem1 = &temp; // take the address of the variable and save it to the pointer 
    } 
    void DOOperation_2() 
    { 

    } 
    DOOperation_3() 
    { 

    } 


};