Opérateur d’affectation par défaut dans la classe interne avec des membres de référence

J’ai rencontré un problème que je ne comprends pas et j’espérais que quelqu’un ici pourrait donner un aperçu. Le code simplifié est le suivant (le code d’origine était une implémentation personnalisée de la queue / de la queue):

class B { public: B() {}; class C { public: int get(); C(B&b) : b(b){}; private: B& b; }; public: C get_c() { return C(*this); } }; int main() { B b; B::C c = b.get_c(); c = b.get_c(); return EXIT_SUCCESS; } 

Ceci, une fois compilé, me donne l’erreur suivante:

 foo.cpp: In member function 'B::C& B::C::operator=(const B::C&)': foo.cpp:46: error: non-static reference member 'B& B::C::b', can't use default assignment operator foo.cpp: In function 'int main()': foo.cpp:63: note: synthesized method 'B::C& B::C::operator=(const B::C&)' first required here 

Je peux contourner ce problème en utilisant deux variables C distinctes, car elles sont supposées être des objects ‘C’ indépendants, mais cela ne fait que masquer le problème (je ne comprends toujours pas pourquoi je ne peux pas le faire).

Je pense que la raison en est que la référence ne peut pas être copiée, mais je ne comprends pas pourquoi. Dois-je fournir mon propre opérateur d’assignation et mon propre constructeur de copie?

Ce problème n’a rien à voir avec les classes internes. En C ++, vous ne pouvez tout simplement pas (ré) assigner de références – elles doivent être initialisées lorsqu’elles sont définies.

Un exemple plus simple est:

 class B { public: B(int& i) : ir(i) {}; int& ir; }; int main() { int i; B b(i); // Constructor - OK int j; B bb = B(j); // Copy constructor - OK bb = b; // Assignment - Error return 0; } 

Une référence ne peut pas être modifiée après avoir reçu sa valeur initiale. Cela signifie qu’il est impossible d’écrire un opérateur d’affectation qui modifie la valeur d’un membre de référence. Si vous avez besoin de faire cela, utilisez un pointeur au lieu d’une référence.

En fait, il y a une solution à cela. Vous pouvez implémenter operator = en termes de construction de copie , et cela fonctionnera 🙂 C’est une technique très performante pour de tels cas. En supposant que vous souhaitiez soutenir une affectation.

C ++ n’a pas de “classes internes”, juste des déclarations de classe nestedes. Les “classes internes” sont un Java-isme qui, je pense, ne se trouve pas dans les autres langages traditionnels. En Java, les classes internes sont spéciales car elles contiennent une référence immuable implicite à un object du type contenant. Pour obtenir l’équivalent des déclarations nestedes C ++ en Java, il est nécessaire d’utiliser des classes internes statiques. Les classes internes statiques ne contiennent pas de référence à un object du type déclarant.