[英]How to initialize `static` member polymorphically
說我有基類Validator
。
class Validator
{
public:
void validate(const string& str)
{
if( k_valid_keys.find(str) == k_valid_keys.end() )
throw exception();
}
private:
const static std::set<string> k_valid_keys;
};
現在假設我需要擴展Validator
類。 每個派生類將具有其自己的有效密鑰集。
我的目標是:
k_valid_keys
為Validator
的成員。 無需將其添加到每個派生類中,尤其是當它們的類型不止一種時。 k_valid_keys
static
。 假設我有多個Validator
實例(及其派生類),並且k_valid_keys
初始化非常昂貴。 如何多態初始化static
成員? 好吧,我知道這是不可能完成的(如果我錯了,請更正)。
因此,假設無法解決這個問題,那么有沒有一個更好的設計解決方案?
由於k_valid_keys
是static
,在申報Validator
,從所有的派生類Validator
將共享相同的實例k_valid_keys
。 就是這樣,你就不能有子類的多個實例Validator
在你的程序的同時,否則你不同的subclases的實例Validator
將元素添加到相同的結構。
就是說,類上的靜態成員變量只是整個程序的全局變量。
如果您有兩個或多個Validator
但可以保證只有一個實例,則只需在子類構造函數上初始化k_valid_keys
。
您可以執行以下操作:使用映射映射std :: type_index代替一組鍵作為靜態成員(或者,如果不能使用C ++ 11,請使用std :: type_info *)。 在每個派生類中,都有一個虛函數,該虛函數返回一個類的valid_keys集,基類中的validate
函數應使用typeid
獲得實際對象的type_info
,檢查其在映射中是否已有鍵-如果不是,則調用返回該集合的虛函數,並將該條目添加到映射中。
在Validator
類的構造函數中傳遞對k_valid_keys
的引用,並初始化成員引用。 您將跳過多個Validator
類的構造,但必須管理其生命周期。
然后,也可以根據需要為每個繼承的類型設置一個。
使用按類型或鍵訪問的k_valid_keys
寄存器也可以工作。 當然,您需要將對該寄存器的引用傳遞給Validator
類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.