无法理解编译器在复制构造函数上引发的错误消息[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法理解编译器在复制构造函数上引发的错误消息[关闭]相关的知识,希望对你有一定的参考价值。

#include <iostream>
using namespace std;
class dummy
{
    private:
    int a,b,*p;
    public:
    void setdata(int x,int y,int z)
    {
        a=x;
        b=y;
        p=&z;
    }
    void showdata()
    {
        cout<<"a "<<a<<"b "<<b<<" pointer address c "<<&p<<endl;
    }
    dummy(dummy &d)
    {
        a=d.a;
        b=d.b;
        p=d.p;
        cout<<"a "<<a<<"b "<<b<<" pointer address c "<<&p<<endl;
    }
    dummy(dummy &d)
    {
        d.a;b=d.b;p=d.p;
    }
};
int main()
{
    dummy d1;//error is here;
    d1.setdata(3,4,5);
    dummy d2=d1;
    d2.showdata();
    d1.showdata();
    return 0;
}

提出错误

:/ root / copy deep shallow / main.cpp | 15 | error:没有匹配函数来调用'dummy :: dummy()'|

我无法理解为什么会出现错误消息以及此问题的解决方案是什么

答案

该类没有默认构造函数,因为存在显式定义的复制构造函数

dummy(dummy &d){a=d.a;b=d.b;p=d.p;}

(应该使用参数const dummy &声明)

但是在这个宣言中

dummy d1;

需要缺少默认构造函数。

您已明确定义默认构造函数。

考虑到例如这个成员函数

void setdata(int x,int y,int z)
{a=x;b=y;p=&z;}

导致未定义的行为,因为指针p在退出函数后将具有无效值,因为局部变量(参数)z将被销毁。

另一答案
dummy()
{
}

dummy(dummy &d)
{
    a=d.a;
    b=d.b;
    p=d.p;
    cout<<"a "<<a<<"b "<<b<<" pointer address c "<<&p<<endl;
}

这将解决您的问题。

通过这种方式,您可以定义默认构造函数(1st)和复制构造函数(2nd)

在您的代码中,您没有提供默认构造函数和两个复制构造函数,因此编译器会先抱怨缺少构造函数,但是什么时候会解决它会因为模糊复制构造函数而引发另一个错误(编译器会告诉您我不是知道哪一个电话)。

作为第三个错误,setData()将导致在销毁z后p的未定义行为无效。

另一答案

你的问题不是复制构造函数,而是默认构造函数。无论何时用C ++编写类,编译器都会生成一组默认函数,因此您不必显式键入它们。那些是:

  • 默认构造函数:dummy::dummy()
  • 复制构造函数:dummy::dummy(const dummy&)
  • 复制赋值运算符:dummy& dummy::operator=(const dummy&)
  • 驱逐舰:dummy::~dummy()

在C ++ 11标准中,您还可以获得移动构造函数和移动赋值运算符,但这些并不重要。

编译器会为您添加这些类,但如果您定义任何构造函数,它将不会生成隐式默认构造函数。

如果您想拥有默认构造函数(并且能够在代码中使用dummy d1;),请将以下构造函数定义添加到类中:

dummy(){}

或更好,如果您使用C ++ 11标准:

dummy() = default;

附注:在这种情况下,您不需要显式复制构造函数。您的实现只是将每个字段的内容复制到新对象,因此隐式复制构造函数(由编译器生成)就足够了。

以上是关于无法理解编译器在复制构造函数上引发的错误消息[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

复制构造函数相关的编译器错误

如果构造函数中发生错误,Qt 会做啥? [复制]

如果我尝试在不同的公共类中将数组作为参数传递,为啥我的构造函数无法在 Java 中编译?

在命名空间内定义函数时引发链接器错误? [复制]

带有私有构造函数的类型的JsonSerializationException

C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]