簡體   English   中英

如何多態初始化`static`成員

[英]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類。 每個派生類將具有其自己的有效密鑰集。
我的目標是:

  1. 保持k_valid_keysValidator的成員。 無需將其添加到每個派生類中,尤其是當它們的類型不止一種時。
  2. 保持k_valid_keys static 假設我有多個Validator實例(及其派生類),並且k_valid_keys初始化非常昂貴。

如何多態初始化static成員? 好吧,我知道這是不可能完成的(如果我錯了,請更正)。

因此,假設無法解決這個問題,那么有沒有一個更好的設計解決方案?

由於k_valid_keysstatic ,在申報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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM