我正在尝试使用默认值创建构造函数。复杂性来自于为类使用单独的头文件和代码文件。我有一个包含以下内容的头文件:
class foo {
bool dbg;
public:
foo(bool debug = false);
}
包含以下内容的代码文件:
foo::foo(bool debug = false) {
dbg = debug;
}
当我尝试用g ++编译(即g++ -c foo.cc
)时,它会出错:
foo.cc:373:65: error: default argument given for parameter 1 of ‘foo::foo(bool)’
foo.h:66:4: error: after previous specification in ‘foo::foo(bool)’
我做错了什么?
答案 0 :(得分:13)
默认只能放在头文件中。根据我的经验,在构造函数(或其他函数)中使用默认值很少是一个好主意 - 它通常会在某个地方出现问题。不是说我自己的代码中没有一些!
答案 1 :(得分:8)
不要在定义中提供默认值:
foo::foo(bool debug) {
dbg = debug;
}
现在是正确的。默认值应仅在声明中提供,您已在头文件中完成。
顺便说一句,更喜欢使用成员初始化列表而不是分配:
当然,如果它的声明兼定义,那么你必须在声明兼定义中提供默认值(如果你想要的话):
class foo {
bool dbg;
public:
foo(bool debug = false) : dbg(debug) {}
//^^^^^^^^^^^ using member initialization list
}
答案 2 :(得分:4)
当声明和定义分开时,默认值必须仅在函数的声明中。
如果您愿意,可以将默认值添加为注释,但是您应该知道,因为更改默认值并忘记更改注释可能会导致一些误导(:
例如:
foo(bool debug = false);
//...
foo::foo(bool debug /* = false */ )
{ /* ... */ }
答案 3 :(得分:2)
在C ++中(我不知道其他语言),默认参数只是函数声明&的一部分。不是功能定义。
class foo {
bool dbg;
public:
foo(bool debug = false);
}
很好,将你的定义改为:
foo::foo(bool debug) {
dbg = debug;
}
答案 4 :(得分:1)
它不需要成员函数定义中的默认参数
foo::foo(bool debug) {
dbg = debug;
}