【问题标题】:MinGW treats second declaration of an object in a class as a ConstructorMinGW 将类中对象的第二次声明视为构造函数
【发布时间】:2020-09-04 07:18:07
【问题描述】:

我正在尝试编写一个类(我们称之为Bar),它将另一个类(Foo)的对象作为构造函数的参数。我还有一个Foo 类的对象声明为Bar 的属性。下面是一些示例代码:

#include <iostream>

class Foo {
public:
    Foo(int i) {
        std::cout << i;
    }
};

class Bar {
private:
    Foo fooObject1;

public:
    Bar(Foo fooObject2) {

    }
};

int main() {

}

出于某种原因,g++ (MinGW) 似乎将Foo 对象的第二个声明(作为Bar 构造函数的参数)视为构造函数。尝试编译该代码示例会出现以下错误:

test.cpp: In constructor 'Bar::Bar(Foo)':
test.cpp:15:25: error: no matching function for call to 'Foo::Foo()'
   15 |     Bar(Foo fooObject2) {
      |                         ^
test.cpp:5:5: note: candidate: 'Foo::Foo(int)'
    5 |     Foo(int i) {
      |     ^~~
test.cpp:5:5: note:   candidate expects 1 argument, 0 provided
test.cpp:3:7: note: candidate: 'constexpr Foo::Foo(const Foo&)'
    3 | class Foo {
      |       ^~~
test.cpp:3:7: note:   candidate expects 1 argument, 0 provided
test.cpp:3:7: note: candidate: 'constexpr Foo::Foo(Foo&&)'
test.cpp:3:7: note:   candidate expects 1 argument, 0 provided

什么原因导致这个错误,我该如何防止这个错误?

【问题讨论】:

  • 您正在尝试创建 Foo 对象的副本并将其打包到 Bar 中。根据您的编译器输出,您可能想编写一个复制构造函数Foo::Foo(const Foo&amp;)。由于您拥有的唯一构造函数是 Foo(int) 所以您的程序不知道它应该如何复制 Foo。

标签: c++ class object g++ mingw


【解决方案1】:

不是声明被视为构造函数调用,而是成员fooObject1需要在Bar的构造函数中以某种方式初始化。所以编译器会生成一些代码来调用默认构造函数Foo::Foo()。但那不存在,所以你得到一个错误。

一种解决方案是显式初始化成员初始化器列表中的成员:

Bar(Foo fooObject2) : fooObject1(fooObject2) { ... }

另一种方法是为Foo 提供默认构造函数。

【讨论】:

    【解决方案2】:

    Bar 构造函数试图默认构造 fooObject1,但 Foo 没有默认构造函数。

    Foo() = default; 添加到Foo 即可编译。

    【讨论】:

      【解决方案3】:

      也许你想将fooObject2 复制到fooObject1 (不太清楚你想做什么)。如果是这样,那么这段代码就是你想要的

      Bar(Foo fooObject2) : fooObject1(fooObject2) {
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 2018-11-04
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多