2014-09-24 55 views
0

我很困惑,我可以在哪裏定義枚舉以及我可以在哪裏使用它。我有3個文件,main.cpp,function.cpp和function.h(名稱已被簡化)。在function.h我在頭文件,類和主要枚舉

class Function{ 
    public: 
    enum Letters{A, B, C}; 
//more stuff not related 
    private: 
//stuff 
} 

而且function.h在main.cpp中和function.cpp在main.cpp中執行#included

不過,我想有一個變量:信信;所以我可以從用戶那裏得到一個輸入,將該輸入設置爲鍵入ie letter = A,然後將其用於構造函數構造構造函數(...,letter,...),因爲function.cpp中的構造函數需要一個「Letters 「在爭論中。

那麼有什麼辦法可以訪問main.cpp中的「Letters」類型嗎?如果不是,我正在考慮重寫構造函數,以便它接受「string letterIn」參數,然後將該字符串更改爲Type即if(letterIn ==「A」)Type type = A;

(我推廣了很多變量名的位置,因此它可以適用於其他人的情況下,我可以做的更多細節我自己的項目,如果它會幫助)由於要使用枚舉在

+0

在您的真實代碼中'Letters'也是私有的嗎? – juanchopanza 2014-09-24 20:49:53

+1

如果你聲明它是公開的,你可以在main中使用它作爲'Function :: A','Function :: B'和'Function :: C'。這是在C++ 11之前給枚舉一個範圍的主要方法。 – Medinoc 2014-09-24 20:52:55

+0

對不起,我在function.h示例中刪除了太多內容。我現在更新了它。我的枚舉被公開。 @Medinoc你的意思是我可以做Function :: Letters letter;?我沒有完全遵循,對不起,我從來沒有做過枚舉。編輯:我剛剛看到你在下面的問題的意見之一回答了這個問題。謝謝! – 2014-09-24 21:00:26

回答

2

構造函數,我假設你可以公開它。它是這樣,你可以訪問它想:

class Function{ 
    enum Letters{A, B, C}; 
//more stuff not related 
} 

int main(int argc, char** argv} { 

    Function::Letters letter1 = Function::A; 
    //or 
    Function::Letters letter2 = Function::Letters::A; 

} 

,或者如Medinoc指出,如果聲明的枚舉作爲enum class

int main(int argc, char** argv} { 

    Function::Letters letter = Function::Letters::A; 
} 
+1

如果它是'enum'而不是'enum class'(C++ 11),它應該是'Function :: A'而不是'Function :: Letters :: A'。 – Medinoc 2014-09-24 20:59:04

+0

感謝您指出, – 2014-09-24 20:59:51

+0

它是枚舉,而不是枚舉類。所以爲了確保我能理解這一點:我可以做Function :: Letters,然後再letter = Function :: A(B或C)? – 2014-09-24 21:05:33

1

你可以做到這一點在許多方面。

你可以把它聲明,聲明你的類的頭裏面:

class HasEnums 
{ 
    public: 
     enum Letters { A, B, C }; 
    ... 
    HasEnums(Letters letter) { ... } 
}; 

然後在main.cpp中:

#include "hasenums.h" 

HasENums::Letters letter = A; 

HasEnums h(letter); 
HasEnums i(HasENums::B); 

或在頭文件,在類的外部:

enum Letters { A, B, C }; 

class NoEnums 
{ 
    public: 
    NoEmums(Letters letter) { ... } 
}; 

然後主要:

#include "noenums.h" 

Letters letter = A; 

NoEnums n(letter); 
NoEnums m(B); 

有幾十個其他可能的情況,但這兩個看起來是最合理的,取決於你真正想描述的。在類中聲明Letters的好處是,您可以在另一個類中使用另一個enum Letters,並且在同一個編譯單元中需要noenums.h和新文件noenums2.h時,不需要重命名其中一個。

還請注意,你可以做一個私人enum,不能在類的外部使用:

class HasPrivEnum 
{ 
    enum Letters { A, B, C }; 
    ... 
    public: 
    HasPrivEnum(Letters letter) {...} 
}; 

但現在你會無法編譯使用類HasPrivEnum::Letters之外的代碼(沒有friend聲明)。這在某些情況下可能有用,但不適用於您所描述的情況。