繁体   English   中英

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

[英]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; -即它试图定义一个名为sourceset对象-括号是多余的,但允许使用。

您可以在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.

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