Lors de la construction d'objets avec des membres privés qui nécessitent des références lvalue non const dans leur constructeurs, comme dans le cas de Foo, il peut être difficile de transmettre des valeurs appropriées. La modification de la classe Foo n'est pas toujours réalisable et l'utilisation de pointeurs bruts n'est pas souhaitable.
Dans cette situation, l'erreur provient de la tentative de lier une référence lvalue de type 'int&' à une rvalue de type 'int' lorsque initialiser le membre privé 'f' de la classe Bar. Le constructeur Foo attend une variable nommée, pas une valeur temporaire, comme dans ce cas, où « genValue() » renvoie un entier.
Pour résoudre le problème, envisagez plutôt de transmettre l'argument au constructeur Foo par valeur. de référence. Ce faisant, une copie de l'entier renvoyé par « genValue() » est créée et affectée au membre « x » de l'objet Foo.
Voici le code corrigé :
<code class="cpp">class Foo { public: Foo(int x) { // Pass by value this->x = x; } private: int x; }; class Bar { public: Bar(): f(genValue()) { // Pass by value } private: Foo f; int genValue() { int x; // do something ... x = 1; return x; } };</code>
En passant la valeur de retour genValue() comme argument réel, le compilateur attribue la valeur de la variable temporaire au membre x de l'objet Foo. Cette approche évite l'erreur tout en conservant le comportement prévu.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!