类的复制和交换习惯用法,引用抽象类

dar*_*mos 2 c++ abstract-class reference copy-and-swap

我正在尝试为我的类实现Copy-and-Swap Idiom,因为我需要实现operator=,因为它有引用成员,并且引用只能分配一次,我认为前面提到的成语是一个有效的解决方法.

但现在我收到了一个构建错误:

>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>          ]
Run Code Online (Sandbox Code Playgroud)

它在这里指出我:

void Swap( CMessage& a, CMessage& b ){
    using std::swap;
    swap( a.m_bIgnoreIncoming, b.m_bIgnoreIncoming );
    swap( a.m_Variables, b.m_Variables );
}
Run Code Online (Sandbox Code Playgroud)

这是成语中的Swap函数,m_Variables实际上是对抽象类的引用.交换那种引用是不可能的?如果有针对此的Boost解决方案,请告诉我,因为我最近开始使用它.

Mik*_*our 5

引用不能再被交换,也不能被重新分配.swap将尝试交换被引用的对象(通过临时对象分配它们,如果使用默认对象std::swap).由于它们引用了抽象基类,因此无法创建临时类,因此失败.

如果需要可重新分配的引用,请改用指针.

  • 您也可以使用pimpl.将您的参考文献放入pimpl并交换pimpl. (2认同)
  • C++标准化委员会计划通过添加诸如`int &&&`;-)之类的s值引用来解决C++ 2x中的这个问题 (2认同)