C++:类成员中的默认值

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,但在任何地方都找不到任何解决方案.我究竟做错了什么?

Kon*_*rad 7

您没有在标头中指定参数的默认值,编译器正在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)

作为旁注,请记住,您不必将参数的注释默认值放在实现文件中,但是可读性是个好主意.


Luc*_*ore 5

您需要在类定义中声明默认值,而不是在实现中。

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)