Credo che questa domanda è meglio chiese con un piccolo frammento di codice che ho appena scritto:Cosa succede in C++ quando passo un oggetto per riferimento e non rientra nell'ambito?
#include <iostream>
using namespace std;
class BasicClass
{
public:
BasicClass()
{
}
void print()
{
cout << "I'm printing" << endl;
}
};
class FriendlyClass
{
public:
FriendlyClass(BasicClass& myFriend) :
_myFriend(myFriend)
{
}
void printFriend()
{
cout << "Printing my friend: ";
_myFriend.print();
}
private:
BasicClass& _myFriend;
};
int main(int argv, char** argc)
{
FriendlyClass* fc;
{
BasicClass bc;
fc = new FriendlyClass(bc);
fc->printFriend();
}
fc->printFriend();
delete fc;
return 0;
}
Il codice compila e funziona bene con g ++:
$ g++ test.cc -o test
$ ./test
Printing my friend: I'm printing
Printing my friend: I'm printing
Tuttavia, questo non è il comportamento che ero aspettando. Mi aspettavo un qualche tipo di errore durante la seconda chiamata a fc->printFriend()
. La mia comprensione di come il passaggio/memorizzazione per riferimento funziona in modo errato o si tratta di qualcosa che funziona solo su piccola scala e probabilmente esploderebbe in un'applicazione più sofisticata?
Non ti piace quando tutti gridiamo "comportamento indefinito!" all'unisono? 8v) –
"Mi aspettavo una sorta di errore al secondo". Basta rendere print() virtuale o memorizzare il testo che si sta stampando come variabile membro std :: string, e si otterrà il tuo errore. – SigTerm
In genere non si desidera referenziare come membri dati in C++. Probabilmente stai venendo da uno sfondo Java. I riferimenti C++ non sono come riferimenti Java. Se vuoi qualcosa come un riferimento Java, usa un 'std :: shared_ptr' e crea l'oggetto sull'heap. –
fredoverflow