2012-03-21 191 views
5

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

从Someclass.h:从SomeClass.cpp

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

...:

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 

我曾尝试直接指定的默认值将在头文件中的类声明,等等。我也试过在一般的搜索都堆栈溢出和谷歌,但不能随时随地找到解决方案我究竟做错了什么?

回答

6

您还没有指定的默认值的参数在头正因为如此,编译器正在为您的语句s.printOut();寻找签名void printOut(void)的功能,但正确无法找到它。你需要的是:

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

作为一个方面说明,记住,你不必把注释掉默认值的参数在执行文件,但它是可读性的好主意。

+0

我可以发誓我试过了。 :-S但是 - 我当然没有 - 它的工作很完美,我非常感谢您的帮助 - 谢谢! – gustafbstrom 2012-03-21 11:53:22

+0

我的荣幸,很高兴我能帮上忙。 – Konrad 2012-03-21 11:55:11

1

必须在方法的声明中指定缺省值,而不是在实现中指定。

+0

谢谢。这使得诡计! – gustafbstrom 2012-03-21 11:56:56

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(); 

不会做你希望它做什么。它不创建类型SomeClass的对象s,但声明函数s,返回类型为SomeClasss.printOut();不应该编译。

你可能想:

SomeClass s; 
+0

我可以发誓我试过了。 :-S但是 - 我当然没有 - 它的工作很完美,我非常感谢您的帮助 - 谢谢! 此外,谢谢指出s()问题,在这种情况下实际上是一个错字。显示真正的代码阅读技巧! – gustafbstrom 2012-03-21 11:54:30

1

默认参数必须在标题中这样定义:

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

重写如下..注布尔B =假

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

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

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

的默认值已在声明中,而不是在定义中指定。您可以在两处指定默认值,但无法从定义中省略。希望我有点困惑你。我将展示电子\更正后的代码可以让你了解:

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

这不会编译,你的实现中的签名是错误的 – Konrad 2012-03-21 11:20:10

+0

你说哪一行代码? – 2012-03-21 11:31:10

+0

谢谢,这使得伎俩。 'SomeClass s();'行实际上是一个错字,当然应该是'SomeClass s';'谢谢你指出。 – gustafbstrom 2012-03-21 11:58:48