0

为什么以下代码不起作用:

#include <iostream>

class Entity
{
public:
    /*
    Entity()
    {
        std::cout << "Create Entity with default constructor" << std::endl;
    }
     */

    Entity(int x)
    {
        std::cout << "Create Entity with " << x << std::endl;
    }
};

class Example
{
    Entity ent;
    int age;

public:
    Example()
            //: ent(7), age(7)
    {
        ent=Entity(7);
        age=7;
    }
};

int main() {
    Example s1;
    return 0;
}

它说它需要实体的默认构造函数,但为什么呢?我使用的唯一 Entity 对象是使用使用 1 个参数的构造函数构建的。

另外,为什么更改Example s1;Example s1();会导致我的代码以不同的方式工作(我在屏幕上看不到任何打印。

4

3 回答 3

2

在构造函数内部,已经需要构造Example成员变量。ent错误所指的正是这种结构。

解决方案是使用构造函数初始化程序列表,您已在所示示例中将其注释掉。


至于

Example s1();

这声明s1为一个不带参数并按值返回Example对象的函数。

于 2020-05-19T16:20:18.597 回答
1

在此构造函数的主体内

Example()
        //: ent(7), age(7)
{
    ent=Entity(7);
    age=7;
}

赋值语句中使用的数据成员ent(在赋值运算符中可以使用已经构造的对象)

    ent=Entity(7);

必须已经构建。但是,它不能使用不存在的默认构造函数来构造。此表达式Entity( 7 ) 不创建对象entent它使用编译器隐式定义的默认复制赋值运算符创建一个临时对象。

你至少要写

Example() : ent(7), age(7)
{
}

在类的构造函数的 mem-initializer 列表中显式指定调用的构造函数Example。在这种情况下,ent将使用此构造函数创建数据成员,然后将控件传递给类的构造函数的主体Example

于 2020-05-19T16:21:16.730 回答
0

当您显式定义任何构造函数时,隐式定义的默认构造函数将被删除并且无法使用。

当您没有在构造函数中使用初始化列表语法显式初始化成员时,将使用默认构造函数对其进行初始化。

Example()
{
    ent=Entity(7);
    age=7;
}

相当于

Example() : ent(), age()
{
    ent=Entity(7);
    age=7;
}

这解释了编译器错误。要修复错误,请使用

Example() : ent(7), age(7)
{
}
于 2020-05-19T16:20:38.193 回答