2016-04-28 146 views
-2

即使我嘗試了很多,但我不知道我的代碼中的錯誤在哪裏。看起來很簡單。錯誤:沒有適當的默認構造函數可用

enum Suit { none, clubs, diamonds, hearts, spades }; 
enum Symbol { none_, ace, king, queen, jack, ten, nine, eight, seven }; 

class Card 
{ 
private: 
    Suit suit_; 
    Symbol symbol_; 

public: 

    Card(Suit suit, Symbol symbol) 
    { 
     suit_=suit; 
     symbol_=symbol; 
    }; 
+1

你好。歡迎來到Stack Overflow。請環顧四周,參加[旅遊],並通讀[幫助中心]。你也可以閱讀關於[問]一個很好的問題。 – Sampada

+0

錯誤說的是什麼,它表示哪一行是錯誤的? – immibis

+0

您的代碼不能編譯,而不是列出的錯誤。你確定你複製+粘貼正確嗎?如果您需要添加更多信息,您可以[編輯]您的問題 – Tas

回答

0

您的班級沒有default constructor。這本身不是問題。但是,如果您嘗試調用不存在的default constructor,則會顯示錯誤。你可能做這樣的事情在其他地方(那些線之一,就足以把那個錯誤):

Card x; 
std::vector<Card> v(3); 
auto x=std::make_shared<Card>(); 
//...and many others... 

解決方案?

如果你真的不想讓Card被分配而沒有提供參數,你不應該這樣做。找到試圖分配Card對象並修改它的代碼。 BTW最好是deletedefault constructor在一個明確的說法是這樣的:

class Card{ 
private: 
    Suit suit_; 
    Symbol symbol_; 
public: 
    Card()=delete; 
    Card(Suit suit, Symbol symbol) 
    { 
     suit_=suit; 
     symbol_=symbol; 
    } 
}; 

如果你是從Card類用默認值分配對象確定,然後添加此相反:

class Card{ 
private: 
    Suit suit_; 
    Symbol symbol_; 
public: 
    Card()=default; 
    //Or Card():suit_(some_value),symbol_(somevalue){} 
    Card(Suit suit, Symbol symbol) 
    { 
     suit_=suit; 
     symbol_=symbol; 
    } 
}; 
+1

我喜歡這個答案,但是:誰知道這是否會解決OP的問題,因爲沒有足夠的提供了信息(不管你的答案是否有用),我覺得提及_why_默認構造函數沒有生成會很好 – Tas

0

您已經定義你自己的構造函數,在這種情況下,編譯器不會添加默認的構造函數。從今以後,如果你想爲下面提到創建一個對象,你將最終沒有默認構造函數的錯誤

card obj; //錯誤

解決方案:

1)傳遞參數,在創建對象(Most appropriate具體根據片斷):

例如:

Suit suitenum = clubs; 
Symbol symnum = king; 
Card obj(suitenum,symnum); 

2)定義默認CON結構函數:

class Card 
{ 
    private: 
     Suit suit_; 
     Symbol symbol_; 

    public: 
     Card(){}; 

     Card(Suit suit, Symbol symbol) 
     { 
      suit_=suit; 
      symbol_=symbol; 
     }; 

}; 
0

爲了簡化它,你只需提供默認構造函數(無參數)。

Card() 
{ 
} 

您需要默認構造函數的原因是您正在使用此類型的vector(容器)。 (類)。對於容器類,包含的類(卡)必須具有默認構造函數。

相關問題