C ++通过引用将对象传递给函数,其构造函数被调用

时间:2017-02-28 02:19:46

标签: c++

我试图弄清楚如何正确使用多个文件。我在头文件中创建了一个类。然后是一个包含该头文件并使用Stage :: Stage(){}等实现所有内容的cpp文件。我还创建了一个名为Display的类,它没有默认构造函数,但需要2个整数参数。我在Stage类中创建了一个函数:

Stage::Stage (Display &display_){
    display = display_;
}

但它会导致错误"没有匹配功能来调用' Display :: Display()'" 这是真的,它不存在,但它不应该存在。我不想在这里创建一个新的Display对象,我试图将现有的对象传递给Stage对象。 (我使用Dev C ++)

1 个答案:

答案 0 :(得分:3)

在执行构造函数体之前,您的Stage构造函数必须默认初始化display。必须在执行类的构造函数的主体之前构造所有类成员。没有例外。因此,显示的代码在使用赋值运算符之前尝试默认构造display

由于Display没有默认构造函数,因此失败,因此编译器抱怨没有defualt构造函数。

在这种情况下,您必须在构造函数的初始化部分显式构造display

Stage::Stage (Display &display_) : display{display_}
{
}

或者,预C ++ 11:

Stage::Stage (Display &display_) : display(display_)
{
}

这从一开始就明确地构造了display成员,大概是使用它的拷贝构造函数。