Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不存在类错误的默认构造函数_C++_Constructor - Fatal编程技术网

C++ 不存在类错误的默认构造函数

C++ 不存在类错误的默认构造函数,c++,constructor,C++,Constructor,一些简单的代码: class Thing { public: int num; Thing(int num) { this->num = num; } }; class Stuff { public: Thing thing; // an instance of thing is declared here but it cannot construct it Stuff(Thing thing) { this

一些简单的代码:

class Thing {
public:
    int num;
    Thing(int num) { 
        this->num = num; 
    }
};

class Stuff {
public:
    Thing thing;  // an instance of thing is declared here but it cannot construct it
    Stuff(Thing thing) {
        this->thing = thing;
    }
};

int main() {
    Thing thing = Thing(5);
    Stuff stuff = Stuff(thing);
}
所以在这里,我试图弄清楚我应该如何在Stuff的构造函数中获取一个新的实例,而不指向它,因为我希望Stuff保存自己的副本。当然,我不能像上面那样声明东西,因为它试图初始化它

如何通过类的构造函数将新对象副本分配给类的变量

确切的错误是:

在构造函数“Stuff::Stuff(Thing)”中:
错误:调用“Thing::Thing()”时没有匹配的函数
东西{this->Thing=Thing;}
候选参数需要1个参数,提供0个

对象的唯一构造函数
采用
int
参数

因此,当您声明:

Thing thing;
没有参数,它如何知道
num
应该是什么

如错误所述,应为1,但未提供。您需要添加默认构造函数:

Thing::Thing(void) : num(0){};
或者修改参数:

Thing::Thing(int num=0)
在这两种情况下,我都使用了
0
,但这应该是您认为的
num
应该是“默认值”,而没有指定任何内容

如果没有这个选项,
Stuff
Thing
必须有一个值来初始化它;这是通过初始化列表来支持的,您忽略了在
Thing::Thing
(见上文)中使用该列表,另外,您的
this->num
是不必要的,
num
就足够了

Stuff::Stuff(Thing inThing) : thing(inThing){};

使用初始值设定项列表初始化Stuff中的thing成员:

class Stuff {
public:
    Thing thing;  // an instance of thing is declared here but it cannot construct it
    Stuff(Thing thing): thing(thing) { }
};
问题在于:

Stuff(Thing thing) {
    this->thing = thing;
}
当您输入构造函数的主体时,编译器将已经初始化了对象的数据成员。但是它不能初始化
东西
,因为它没有默认构造函数

解决方案是告诉编译器如何使用initlizer列表初始化它


这样打字更少,代码更简洁,效率更高。(效率更高,因为如果无论如何都要初始化变量,那么为什么要先用一个不需要的值初始化它,以便尽快地分配另一个值呢?当然,因为您当前的代码甚至还没有编译,“效率更高”这句话有点可疑。)

正是我的问题。如何将Stuff类中Thing类型的副本存储为Stuff的任何成员都可以从任何方法访问的属性?@Jazcash在
Stuff
构造函数的init列表中初始化它。一旦您为
类Thing
显式声明了任何构造函数,则不会自动生成默认构造函数。完美答案,这就是我要找的,谢谢!没问题!为了避免混淆,我还将成员变量命名为不同的名称,如mThing或m_Thing。谢谢
Stuff(Thing thing) : thing(thing) {
    // Nothing left to do.
}