Copier une classe C ++ avec une variable membre de type référence
J'ai une classe qui stocke une référence à son parent, la référence est passée dans le constructeur. Si j'essaye de copier un exemple, j'obtiens une erreur "erreur C2582: 'operator =' fonction n'est pas disponible", vraisemblablement vers le bas de la référence non cessible.
Est-il un moyen de contourner cela, ou dois-je viens de changer la variable de pointeur à la place de référence?
e.g (simplifié mais je pense que a la clé de points):
class MyClass
{
public:
MyClass(OtherClass &parent) : parent(parent) {}
private:
OtherClass &parent;
};
MyClass obj(*this);
.
.
.
obj = MyClass(*this);
source d'informationauteur Mr. Boy
Vous devez vous connecter pour publier un commentaire.
Oui, si vous avez besoin à l'appui de la cession, en faisant un pointeur au lieu d'une référence est près de votre seul choix.
Je ne le recommande pas du tout
mais si vous êtes vraiment gung ho sur cela:
Il y a un moyen de le faire et toujours utiliser une référence, utilisez un
reference_wrapper
. Doncdevient
Référence wrappers sont, fondamentalement, tout simplement ré-assignable références.
Oui il suffit de faire les membres d'un pointeur. Une référence ne sera pas en mesure d'être réinstaller, et
il n'y a pas de travail autour de.Edit: @"Steve Jessop" fait un point à la façon de contourner le problème en utilisant le PIMPL idiome (privé mise en œuvre à l'aide d'un "d-" pointeur). Dans une mission, vous devrez supprimer l'ancienne mise en œuvre et de créer une nouvelle copie-construit à partir de la source de l'objet du d-pointeur.
Vous devez implémenter un constructeur de copie et l'initialiser la référence dans ce constructeur de copie, pour pointer vers la même référence que l'objet d'origine.
Je voudrais faire un boost::shared_ptr. Vous pouvez être assez rude avec ces derniers et qu'ils prennent soin d'eux-mêmes. Alors que l'aide d'un pointeur brut moyen tha vous avez à vous soucier que de l'objet maintenu en vie
Comme mentionné par d'autres, en utilisant std::reference_wrapper peut être utilisé. Les fonctions d'assistance std::ref() et std::cref() peut être utilisé, aussi. Contrairement à d'autres offres, C++03 introduit reference_wrapper, ref() et le cref() dans l'espace de noms std::tr1, si vous avez des options si vous n'êtes pas à l'aide de C++11 ou au-delà.