idiome Copier-échange pour la classe avec des références à des classes abstraites
-
27-10-2019 - |
Question
Je suis en train de mettre en œuvre le Copier-Swap Idiom pour ma classe, parce que je dois mettre en œuvre operator=
, et comme il a des membres de référence, et les références ne peut être attribué qu'une seule fois, je pensais que l'idiome mentionné ci-dessus était une solution valable.
Mais maintenant, je reçois une erreur de construction:
>c:\Program Files\Microsoft Visual Studio 10.0\VC\include\utility(102): error C2259: 'IVariables' : cannot instantiate abstract class
1> due to following members:
1> 'IVariables::~IVariables(void)' : is abstract
1> d:\svn.dra.workingcopy\serialport\IVariables.h(6) : see declaration of 'IVariables::~IVariables'
1> 'std::string &IVariables::operator [](const std::string &)' : is abstract
1> d:\svn.dra.workingcopy\serialport\IVariables.h(7) : see declaration of 'IVariables::operator []'
1> 'unsigned int IVariables::getVariableLength(const std::string &) const' : is abstract
1> d:\svn.dra.workingcopy\serialport\IVariables.h(8) : see declaration of 'IVariables::getVariableLength'
1> Message.cpp(32) : see reference to function template instantiation 'void std::swap<IVariables>(_Ty &,_Ty &)' being compiled
1> with
1> [
1> _Ty=IVariables
1> ]
Il me signale ici:
void Swap( CMessage& a, CMessage& b ){
using std::swap;
swap( a.m_bIgnoreIncoming, b.m_bIgnoreIncoming );
swap( a.m_Variables, b.m_Variables );
}
Ceci est la fonction de swap de l'idiome, et m_Variables
est en effet une référence à une classe abstraite. Est-il impossible de remplacer à ce genre de références? S'il y a une solution Boost pour cela, s'il vous plaît me dire depuis que je récemment commencé à l'utiliser.
La solution
Références ne peut être échangé plus qu'elles ne peuvent être réaffectés. swap
tentera d'échanger les objets étant appelés (en leur attribuant au moyen d'un objet temporaire, si l'on utilise le std::swap
par défaut). Comme ils se réfèrent à une classe de base abstraite, cela ne peut depuis le temporaire ne sera pas créé.
Si vous voulez une référence réaffectable, puis utiliser un pointeur à la place.