gus*_*rom 5 c++ default class member
我在为C++类成员指定默认值时遇到问题.我的代码是:
来自Someclass.h:
class SomeClass
{
public:
SomeClass();
~SomeClass();
void printOut (bool);
}
Run Code Online (Sandbox Code Playgroud)
...来自SomeClass.cpp:
void SomeClass::printOut(bool foobar=true)
{
if (foobar) { std::cout << foobar << std::endl; }
}
Run Code Online (Sandbox Code Playgroud)
......最后,来自main.cpp:
int main()
{
SomeClass s;
s.printOut();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是这会给出错误消息(gcc):
../main.cpp: In function `int main()':
../main.cpp:8: error: no matching function for call to `SomeClass::printOut()'
../SomeClass.h:18: note: candidates are: void SomeClass::printOut(bool)
subdir.mk:21: recipe for target `main.o' failed
make: *** [main.o] Error 1
Run Code Online (Sandbox Code Playgroud)
我已经尝试将默认值直接指定到头文件中的类声明等.我也尝试过搜索Stack Overflow和Google,但在任何地方都找不到任何解决方案.我究竟做错了什么?
您没有在标头中指定参数的默认值,编译器正在void printOut(void)为您的语句s.printOut();寻找签名函数,但却没有找到它.你需要的是:
class SomeClass
{
public:
SomeClass();
~SomeClass();
void printOut( bool fValue = true ); // Note change in param in definition
}
Run Code Online (Sandbox Code Playgroud)
在你的cpp:
void SomeClass::printOut(bool foobar /*=true*/ )
{
if (foobar) { std::cout << foobar << std::endl; }
}
Run Code Online (Sandbox Code Playgroud)
作为旁注,请记住,您不必将参数的注释默认值放在实现文件中,但是可读性是个好主意.
您需要在类定义中声明默认值,而不是在实现中。
class SomeClass
{
public:
SomeClass();
~SomeClass();
void printOut (bool foobar = true); //move default here
}
void SomeClass::printOut(bool foobar) //remove from here
{
if (foobar) { std::cout << foobar << std::endl; }
}
Run Code Online (Sandbox Code Playgroud)
另请注意:
SomeClass s();
Run Code Online (Sandbox Code Playgroud)
没有做你期望它做的事情。它不创建s类型为 的对象,而是声明一个返回类型为 的SomeClass函数。不应该编译。sSomeClasss.printOut();
您可能想要:
SomeClass s;
Run Code Online (Sandbox Code Playgroud)