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的全局变量