2012-01-17 85 views
1

Possible Duplicate:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?
Constructing Objects and Calling Member functions設置構造默認值

最近,我瞭解了一些關於構造函數,但今天我一直有麻煩的構造函數的參數設置默認值。

在HPP文件的構造函數聲明如下:

class PlayingCard { 
public: 
    PlayingCard(int value = 0, int suit = 0); //default values supplied 

,並在CPP文件中的定義是這樣的:

PlayingCard::PlayingCard(int value, int suit) : _faceValue(value), _suit(suit) 
{} 

_faceValue_suit是遊戲牌的私有成員) 當我去測試這個像這樣:

PlayingCard card1(); 
PlayingCard card2(7, 1); 

cout << "suit int value: " << card1.getSuit() << 
     " face value: " << card1.getFaceValue() << endl; 
cout << "suit int value: " << card2.getSuit() << 
     " face value: " << card2.getFaceValue() << endl; 

card2工作正常,如果我註釋掉與card1相關的代碼。 否則,我得到錯誤: 請求'card1'中的成員'getSuit',它是非班級類型'PlayingCard()'。

這意味着它不能識別沒有參數的構造函數的使用?我究竟做錯了什麼?

回答

4
PlayingCard card1(); 

不聲明對象,它聲明函數。
它聲明瞭一個名爲card1的函數,它不接受任何參數並返回PlayingCard類型的對象。

要聲明一個對象,你應該做的:

PlayingCard card1; 

這被稱爲Most Vexing Parse在C++中。
今天我第二次接電話。煩人的解析天似乎!

+0

呃哈哈非常感謝你,我現在用它.. – Holly 2012-01-17 11:44:05

1
PlayingCard card1(); 

這將導致不確定性,因爲這可以作爲函數原型與返回類型遊戲牌和簽名卡1與零個參數進行處理。你最好在card1之後刪除(),然後看看。