2012-10-30 38 views
0

我想讓一個類代表一張卡片。但編譯時遇到了這個錯誤。執行錯誤在C++裏面的enum裏面

error: expected `;' before "suit".

任何人都可以幫助這是什麼問題嗎?

#include<string> 
using namespace std; 
class Card { 

private: 
     Card::Suit suit; 
     Card::CardName cardName; 
public: 
    enum Suit {Clubs, Diamonds, Hearts, Spades, UNKNOWN_SUIT}; 
    enum CardName {Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, UNKNOWN_CARDNAME}; 
    class NotInitalised : public exception{}; 
    Card(); 
    Card (int card); 
    Card (Card::Suit s, Card::CardName n); 
    void setCard(Card::Suit, Card::CardName); 
    Card::Suit getSuit(); 
    Card::CardName getCardName(); 
    Card::CardName getCardName(int); 
    int getCardValue(); 
    string toString(); 
}; 
+0

您位於聲明枚舉的相同範圍內。因此,這些類型不需要作用域解析。 – chris

+0

順便說一句,它將枚舉移動到類的頂部時起作用:http://liveworkspace.org/code/67cd31d07367763b0e2d5c4de5ae09cd – chris

+3

不相關:現在在頭文件中使用名稱空間標準符號打破自己的'名稱空間標準'。潛在的副作用不值得方便(並且有*無*便利)。在標題中使用限定名稱空間的ID /類型。 (例如'std :: string') – WhozCraig

回答

2

和C++一樣,你需要在使用它之前聲明一些東西。因此,您必須在申訴成員聲明之前移動enum訴訟的定義。

0

刪除範圍解析操作和使用這種類型的前移動類型聲明

你的類將像下面這樣:

using namespace std; 
class Card { 

private: 
    enum Suit {Clubs, Diamonds, Hearts, Spades, UNKNOWN_SUIT}; 
    enum CardName {Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, UNKNOWN_CARDNAME}; 

    Suit suit; 
    CardName cardName; 
public: 
    class NotInitalised : public exception{}; 
    Card(); 
    Card (int card); 
    Card (Suit s, CardName n); 
    void setCard(Suit, CardName); 
    Suit getSuit(); 
    CardName getCardName(); 
    CardName getCardName(int); 
    int getCardValue(); 
    string toString(); 
}; 
2

你需要使用它們的點之前移動枚舉定義。例如類似的:

#include<string> 
using namespace std; 
class Card { 

public: 
    enum Suit {Clubs, Diamonds, Hearts, Spades, UNKNOWN_SUIT}; 
    enum CardName {Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, UNKNOWN_CARDNAME}; 
private: 
     Card::Suit suit; 
     Card::CardName cardName; 
public: 
    class NotInitalised : public exception{}; 
    Card(); 
    Card (int card); 
    Card (Card::Suit s, Card::CardName n); 
    void setCard(Card::Suit, Card::CardName); 
    Card::Suit getSuit(); 
    Card::CardName getCardName(); 
    Card::CardName getCardName(int); 
    int getCardValue(); 
    string toString(); 
}; 

應該工作。

你也不必限定枚舉的使用你的類定義中,即代替

Card::Suit suit; 

可以使用

Suit suit; 

我通常申報所有的公共元素一個班級在私人班級之前,因爲當我看着它時,我想要擁有該班級的公共界面,但這只是其他人可能不同意的一種格調偏好。