[英]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.