我有以下两个文件
foobar.h
#ifndef FOOBAR_H
#define FOOBAR_H
#include <cstring>
class Foo {
public:
int x;
Foo(int x);
};
class Bar {
public:
char* name;
Foo foo;
Bar(Foo foo);
};
#endif // FOOBAR_H
和foobar.cpp
#include "foobar.h"
Foo::Foo(int x) {
// Do something
}
Bar::Bar(Foo foo) {
// Do something
}
试图用g++ -c foobar.cpp -o foobar.o
编译这些会导致以下错误:
foobar.cpp: In constructor ‘Bar::Bar(Foo)’:
foobar.cpp:9:17: error: no matching function for call to ‘Foo::Foo()’
Bar::Bar(Foo foo) {
^
foobar.cpp:5:1: note: candidate: ‘Foo::Foo(int)’
Foo::Foo(int x) {
^~~
foobar.cpp:5:1: note: candidate expects 1 argument, 0 provided
In file included from foobar.cpp:1:
foobar.h:5:7: note: candidate: ‘constexpr Foo::Foo(const Foo&)’
class Foo {
^~~
foobar.h:5:7: note: candidate expects 1 argument, 0 provided
foobar.h:5:7: note: candidate: ‘constexpr Foo::Foo(Foo&&)’
foobar.h:5:7: note: candidate expects 1 argument, 0 provided
据我所知,g++的输出要求我有foo的默认构造函数。为什么?我希望传递一个foo对象到bar的构造函数,为什么它需要调用默认构造函数的任何地方?我不想有一个无参数的构造函数,因为我需要x有一个特定的用户定义的值。
您试图在这里默认构建Foo
:
Bar::Bar(Foo foo) {
// the member variable `foo` would have been default constructed here
// Do something
}
但是Foo
没有默认构造函数。一种可能的解决方案是在成员初始化列表中初始化它:
Bar::Bar(Foo foo) : foo(std::move(foo)) { // now uses the move constructor instead
// Do something
}