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

时间:2012-03-21 10:32:06

标签: c++ class default member

我在为C ++类成员指定默认值时遇到问题。我的代码是:

来自Someclass.h:

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool);
}

...来自SomeClass.cpp:

void SomeClass::printOut(bool foobar=true)
{
    if (foobar) { std::cout << foobar << std::endl; }
}

...最后,来自main.cpp:

int main()
{
    SomeClass s;
    s.printOut();
    return 0;
}

然而,这会给出错误消息(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

我已经尝试将默认值直接指定到头文件中的类声明等。我也尝试过搜索Stack Overflow和Google,但在任何地方都找不到任何解决方案。我做错了什么?

7 个答案:

答案 0 :(得分:7)

您没有在标头中指定参数的默认值,编译器正在为您的语句void printOut(void)寻找签名s.printOut();的函数,但是没有找到它。你需要的是:

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut( bool fValue = true );  // Note change in param in definition
}

在你的cpp中:

void SomeClass::printOut(bool foobar /*=true*/ )
{
    if (foobar) { std::cout << foobar << std::endl; }
}

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

答案 1 :(得分:4)

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

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; }
}

另外,请注意:

SomeClass s();

不符合您的预期。它不会创建类型为s的对象SomeClass,而是声明一个返回类型为s的函数SomeClasss.printOut();不应该编译。

你可能想要:

SomeClass s;

答案 2 :(得分:1)

默认值必须在方法声明中指定,而不是在实现中指定。

答案 3 :(得分:1)

必须在标题中定义默认参数,如下所示:

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool value = true);
}

答案 4 :(得分:1)

重写如下..注意bool b = false

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool b=false);
}

答案 5 :(得分:1)

尝试在头文件中指定默认值:

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool foobar=true);
}

答案 6 :(得分:0)

默认值必须在声明中指定,而不是在定义中指定。您可以在两个位置指定默认值,但不能从定义中省略。希望我能混淆你。我将展示e \更正的代码,以便您理解:

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool foobar = true);
}

...来自SomeClass.cpp:

void SomeClass::printOut() //or you can use: void SomeClass::printOut(bool foobar=true)
{
    if (foobar) { std::cout << foobar << std::endl; }
}

......最后,来自main.cpp:

int main()
{
    SomeClass s();
    s.printOut();
    return 0;
}