繁体   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