繁体   English   中英

C ++:复制和交换习语,替代构造函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM