如何在类的成员函数中调用复制构造函数?

时间:2009-12-04 04:37:10

标签: c++ class constructor copy

这就是我所拥有的:

void set::operator =(const set& source)
{
    if (&source == this)
        return;

    clear();

    set(source);
}

这是我得到的错误:

  

vset.cxx:33:错误:声明'source'会影响参数

我该如何正确地做到这一点?

6 个答案:

答案 0 :(得分:10)

您正在寻找复制交换习语:

set& set::operator=(set const& source)
{
    /* You actually don't need this. But if creating a copy is expensive then feel free */
    if (&source == this)
        return *this;

    /*
     * This line is invoking the copy constructor.
     * You are copying 'source' into a temporary object not the current one.
     * But the use of the swap() immediately after the copy makes it logically
     * equivalent.
     */
    set tmp(source);
    this->swap(tmp);

    return *this;
}

void swap(set& dst) throw ()
{
    // swap member of this with members of dst
}

答案 1 :(得分:3)

我相信set(source);你试图打电话给复制ctor。您无法在C ++中执行此操作,即您无法显式调用ctor。你可以做的是写私人clone  方法并在copy ctor和assignment operator中调用它。

答案 2 :(得分:1)

正如您所指出的,set(source);是问题的来源(没有双关语)。这不是你认为的那样 - 它不是试图调用复制ctor。相反,它基本上等同于:set source; - 即它正在尝试定义名为set的{​​{1}}对象 - 括号是多余的但是允许。

你可以在一个ctor(或者你想要的任何地方)中调用一个副本ctor但是它不会达到你想要的 - 复制ctor创建一个副本,所以即使你确实调用了它,它也会只需创建一个临时对象,该对象将在该语句的末尾消失。

如前所述,您可能需要的是将数据从一个对象复制到另一个对象的私有函数,然后使用复制ctor和复制赋值运算符中的数据。更好的是,使用默认复制ctor和复制赋值运算符可以正确处理的对象来定义它。

答案 3 :(得分:0)

该错误通常是由一个名为与函数参数相同的局部变量的结果。你可以发布更多的代码吗?

答案 4 :(得分:0)

您看到的错误消息与问题不符,但我不知道它是否相关。您的问题的答案是您无法从代码中调用复制构造函数,因为该对象已经构建。

如果你想避免复制构造函数和operator =之间的代码重复,我建议有一个私有函数来执行常见工作,并从复制构造函数和operator =调用它。

作为参考,您可以通过执行以下操作从复制构造函数调用operator =:

*this = source;

但是,我认为这不是一个好主意,特别是如果你有虚函数或者operator =()函数假设一个完全构造的对象(它可能会这样做)。

答案 5 :(得分:0)

我不知道你的头文件指定的细节,但我会尝试这样的事情(你可能需要为你的特定应用程序修改它):


void set :: operator =(const set& source)
{

if (this == &source)
  {
     return;
  }

size_t i;
this->clear();
data=source.data;
for (i=0; i<source.child.size(); i++)
  {
     child.push_back(new set(*(source.child[i])));
  }  

}


-Joel