2012-03-21 194 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