【发布时间】: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&)。由于您拥有的唯一构造函数是 Foo(int) 所以您的程序不知道它应该如何复制 Foo。
标签: c++ class object g++ mingw