[英]How do you call the copy constructor within a member function of a class?
这是我得到的:
void set::operator =(const set& source)
{
if (&source == this)
return;
clear();
set(source);
}
这是我得到的错误:
vset.cxx:33:错误:'源'的声明遮盖了参数
如何正确执行此操作?
您正在寻找复制交换习惯用法:
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
}
我相信与set(source);
您正在尝试调用复制ctor。 您不能在C ++中做到这一点,即您不能显式调用ctor。 您可以做的是编写一个私有clone
方法,并在复制ctor和赋值运算符中对其进行调用。
如前所述, set(source);
是问题的根源(无双关语)。 这并没有完全按照您的想法做,也不是试图调用复制ctor。 相反,它基本上等效于: set source;
-即它试图定义一个名为source
的set
对象-括号是多余的,但允许使用。
您可以在ctor中(或几乎任何您想要的地方)调用复制ctor,但无论如何都不会达到您想要的内容-复制ctor会创建一个副本,因此即使您确实调用了它,它也只会创建一个副本。临时对象,该对象将在该语句的末尾蒸发。
如前所述,您可能想要的是一个私有函数,用于将数据从一个对象复制到另一个对象,然后在复制控制器和复制赋值运算符中使用它。 更好的是,使用可以由默认复制ctor和复制分配运算符正确处理的对象进行定义。
该错误通常是由于具有与函数参数相同的局部变量而导致的。 您可以发布更多代码吗?
您看到的错误消息与问题不符,但我不知道它是否相关。 问题的答案是,由于对象已被构造,因此无法从代码内部调用复制构造函数。
如果要避免复制构造函数和operator =之间的代码重复,建议使用一个私有函数来完成常见工作,并从复制构造函数和operator =两者中进行调用。
作为参考,您可以通过执行以下操作从副本构造函数调用operator =:
*this = source;
但是,我认为这不是一个好主意,特别是如果您具有虚函数或operator =()函数假定一个完全构造的对象(它可能这样做)时,尤其如此。
我不知道您的头文件指定什么的详细信息,但是我会尝试这样的操作(您可能需要针对特定的应用程序对其进行修改):
无效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])));
}
}
-乔尔
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.