这就是我所拥有的:
void set::operator =(const set& source)
{
if (&source == this)
return;
clear();
set(source);
}
这是我得到的错误:
vset.cxx:33:错误:声明'source'会影响参数
我该如何正确地做到这一点?
答案 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