C++ 如何以多态方式初始化'static'成员

C++ 如何以多态方式初始化'static'成员,c++,polymorphism,static-members,C++,Polymorphism,Static Members,假设我有基类验证器 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; }; 类验证程序 { 公众: 无效验证(常量字符

假设我有基类
验证器

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;
};
类验证程序
{
公众:
无效验证(常量字符串和str)
{
if(k_valid_keys.find(str)=k_valid_keys.end())
抛出异常();
}
私人:
const static std::设置k_有效_键;
};
现在假设我需要扩展类
验证器
。每个派生类都有自己的一组有效键。
我的目标是:

  • 保留
    k\u有效密钥
    验证程序的成员
  • 。无需将其添加到每个派生类中,尤其是当派生类的类型超过几个时
  • 保持
    k\u有效\u键
    静态
    。假设我有多个
    Validator
    (及其派生类)实例,并且
    k\u valid\u密钥的初始化非常昂贵
  • 如何以多态方式初始化
    静态
    成员?嗯,我知道这是做不到的(如果我错了,请纠正)


    因此,假设不能这样做,有没有更好的设计来解决这个问题的想法?

    验证器
    类的构造函数中传递对
    k\u有效密钥
    的引用,并初始化成员引用。您将跳过多个
    验证程序
    类的构造,但必须管理其生命周期

    然后,如果您愿意或不愿意,您可以为每个继承类型创建一个


    使用按类型或键访问的
    k\u有效密钥的寄存器也可以工作。当然,您需要将对该寄存器的引用传递给您的
    验证程序
    类。

    验证程序
    类的构造函数中传递对
    k\u有效密钥
    的引用,并初始化成员引用。您将跳过多个
    验证程序
    类的构造,但必须管理其生命周期

    然后,如果您愿意或不愿意,您可以为每个继承类型创建一个


    使用按类型或键访问的
    k\u有效密钥的寄存器也可以工作。当然,您需要将对该寄存器的引用传递给您的
    验证程序
    类。

    验证程序
    类的构造函数中传递对
    k\u有效密钥
    的引用,并初始化成员引用。您将跳过多个
    验证程序
    类的构造,但必须管理其生命周期

    然后,如果您愿意或不愿意,您可以为每个继承类型创建一个


    使用按类型或键访问的
    k\u有效密钥的寄存器也可以工作。当然,您需要将对该寄存器的引用传递给您的
    验证程序
    类。

    验证程序
    类的构造函数中传递对
    k\u有效密钥
    的引用,并初始化成员引用。您将跳过多个
    验证程序
    类的构造,但必须管理其生命周期

    然后,如果您愿意或不愿意,您可以为每个继承类型创建一个


    使用按类型或键访问的
    k\u有效密钥的寄存器也可以工作。当然,您需要将对该寄存器的引用传递给您的
    验证程序
    类。

    您可以执行以下操作:使用映射std::type_索引到一组键(或者,如果无法使用C++11,则使用std::type_info*),而不是将一组键作为静态成员。在每个派生类中,都有一个虚拟函数返回类的有效密钥集,基类中的
    validate
    函数应该使用
    typeid
    获取实际对象的
    type\u info
    ,检查它在映射中是否已经有密钥-如果没有,则调用虚拟函数返回该密钥集,并将条目添加到映射中。

    您可以执行以下操作:使用映射std::type_索引来映射一组键,而不是将一组键作为静态成员(或者,如果无法使用C++11,则使用std::type_info*)。在每个派生类中,都有一个虚拟函数返回类的有效密钥集,基类中的
    validate
    函数应该使用
    typeid
    获取实际对象的
    type\u info
    ,检查它在映射中是否已经有密钥-如果没有,则调用虚拟函数返回该密钥集,并将条目添加到映射中。

    您可以执行以下操作:使用映射std::type_索引来映射一组键,而不是将一组键作为静态成员(或者,如果无法使用C++11,则使用std::type_info*)。在每个派生类中,都有一个虚拟函数返回类的有效密钥集,基类中的
    validate
    函数应该使用
    typeid
    获取实际对象的
    type\u info
    ,检查它在映射中是否已经有密钥-如果没有,则调用虚拟函数返回该密钥集,并将条目添加到映射中。

    您可以执行以下操作:使用映射std::type_索引来映射一组键,而不是将一组键作为静态成员(或者,如果无法使用C++11,则使用std::type_info*)。在每个派生类中,都有一个虚拟函数返回类的有效密钥集,基类中的
    validate
    函数应该使用
    typeid
    获取实际对象的
    type\u info
    ,检查它在映射中是否已经有密钥-如果没有,则调用虚拟函数返回该密钥集,并且条目被添加到映射中。

    由于
    k\u有效密钥
    是在
    Validator
    声明的
    静态
    ,因此
    Validator
    的所有派生类将共享相同的
    k\u有效密钥
    实例。也就是说,您的程序中不能同时有多个
    Validator
    子类的实例,否则
    Validator
    子类的不同实例将向同一结构添加元素

    也就是说,类上的静态成员变量只是ent的全局变量