[英]C++ : copy-and-swap idiom, alternative constructor
注意:这个问题是在上一个问题之后提出的,我希望仍然可以作为一个新问题来提问。
我正在尝试为树类实现“三个半大规则”(复制和交换习惯):
class Tree
{
friend void swap(Tree &first, Tree &second); // Swap function
public:
Tree(const double &a, const double &b, int depth); // Public constructor (derived from the default (private) constructor)
Tree(const Tree &other); // Copy constructor
~Tree(); // Destructor
Tree & operator=(Tree other); // Copy-assignement operator
private:
Tree(double *a, double *b, int depth, int maxDepth); // Default (private) constructor
double *a, *b;
int depth, maxDepth;
Tree *leftChild, *rightChild;
};
我一直在尝试遵循该准则 。 这是我的复制分配运算符的样子:
Tree & Tree::operator=(Tree other)
{
swap(*this, other);
return *this;
}
我很难让我的公共构造函数工作。 有人建议我这样做:
Tree::Tree(const double &a, const double &b, int depth)
{
double aTemp(a), bTemp(b);
swap(*this, Tree(&aTemp, &bTemp, depth, depth));
}
我不确定这个想法是否可行。 无论如何,我都会从编译器中收到以下错误:
invalid initialization of non-const reference of type 'Tree&' from an rvalue of type 'Tree'
in passing argument 2 of 'void swap(Tree&, Tree&)'
我尝试了以下想法,但我认为这会起作用:
Tree::Tree(const double &a, const double &b, int depth)
{
double aTemp(a), bTemp(b);
*this = Tree(&aTemp, &bTemp, depth, depth);
}
但这似乎也不起作用。 我认为问题在于,当我调用复制分配运算符( *this = Tree(&aTemp, &bTemp, depth, depth)
)时,应该调用复制构造函数(因为复制赋值运算符的参数是通过值传递的),但似乎没有发生。 我不理解为什么。
在此先感谢您的帮助!
在传递'void swap(Tree&,Tree&)'的参数2中从类型'Tree'的右值无效初始化'Tree&'类型的非常量引用
C ++不允许通过非const
引用传递匿名对象。 目的是防止调用者意外丢弃写入参考参数的函数的结果。
您可以这样做:
Tree::Tree(const double &a, const double &b, int depth)
{
double aTemp(a), bTemp(b);
Tree temp(&aTemp, &bTemp, depth, depth);
swap(*this, temp);
}
但这似乎也不起作用。 我认为问题在于,当我调用复制分配运算符(* this = Tree(&aTemp,&bTemp,depth,depth))时,应该调用复制构造函数(因为复制赋值运算符的参数是通过值传递的),但似乎没有发生。 我不理解为什么。
您如何确定它不起作用? 编译器可能会删除副本以避免执行不必要的工作。 ( 这就是为什么您的复制分配运算符按值接受参数的原因。 )
顺便说一句,如果您的编译器支持C ++ 11,则可以改用委托构造器 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.