2013-03-01 57 views
2

在C++中,純虛函數提供接口的功能。也就是說,任何子類必須實現所有純虛函數的基類:是否有嵌套枚舉類的接口機制?

class myClass { 
    virtual bool implementme() = 0; // MUST be implemented 
}; 

class mySubClass : public myClass { 
    bool implementme() {} // REQUIRED 
}; 

是否有類似的機制爲嵌套(enumclass ES?也就是說,我正在尋找像

class myClass { 
    virtual enum class myEnum = 0; // MUST be implemented 
}; 

class mySubClass : public myClass { 
    enum class myEnum {}; // REQUIRED 
}; 
+1

什麼是你想用這個來完成? – 2013-03-01 13:22:29

+0

@DarkFalcon:我想確保'myClass'的所有*子類都有一個具有相同名稱的'enum'。我也想確保沒有「default」枚舉,就像從(非虛擬)'myClass'繼承時那樣。 – 2013-03-01 13:28:09

+0

@Rody - 代碼是否編譯? – 2013-03-01 13:32:30

回答

1

由於您說實現者不是您的代碼庫的一部分(因此不會產生編譯錯誤),我必須假定您正在編寫一個庫,並且使用此枚舉的代碼位於庫的使用者。

我會建議你使用CRTP如下:

class myClass { 
}; 

template<typename T> class myClassImpl : public myClass { 
    static_assert(std::is_enum<typename T::myEnum>::value, "Subclasses of myClassImpl must provide the myEnum enum class"); 
}; 

class mySubClass : public myClassImpl<mySubClass> { 
    enum class myEnum {}; 
}; 
0

這不會有很大的意義。有人只能看到基類(而不是派生類),並從某個虛函數返回myEnum,其中myEnum是不完整的類型。沒有任何類型的虛擬類型的機制,包括枚舉。無論如何,你真的想要一個虛擬表查找你的類型嗎?

+0

我希望'myClass'成爲一個接口,這意味着它不能被瞬間化(每個人至少可以看見一個派生*類)。我也想確保'myClass'的* all *子類有一個名字相同的'enum',它們不會通過'myClass'繼承來獲得。 – 2013-03-01 13:29:45

+1

@RodyOldenhuis你誤解了一個界面是什麼。事實上,這是非常常見的,實際上意圖是讓你有一個指針或引用一個接口,而不會看到_any_派生類。 – David 2013-03-01 13:35:26

+0

不管我是否使用[正確的術語](http://en.wikipedia.org/wiki/Interface_(object-oriented_programming)),你是否知道強制子類實現'enum '而沒有從基類獲得任何默認? – 2013-03-01 13:42:21