我有几个类(相同的基类),只允许一些用户实例化一些。我需要为数据库中的用户保留允许的类。
我当然需要一些建议。因为我认为,我不需要在数据库中将类名列表作为字符串,并在字符串比较的条件下实例化它们。这对我来说感觉不对。
典型情况是
1.调用GetAllowedClassesToInstantiate(用户)[来自数据库]
2.实例化那些类
你有什么建议吗?
此致 布拉克
答案 0 :(得分:0)
制作如下数据结构:
class BaseClass;
std::map<std::string, std::function<BaseClass*()> Factories;
并按以下方式初始化:
class One : BaseClass { ... }
void init() {
Factories["One"] = [](){ return new One(); }
}
基本上它将用作查找ClassName -> Constructor
。
在数据库中保留允许的类名。检索后,将其呈现给用户,当他选择一个选项时,在Factories
中查找正确的构造函数包装函数,并使用它来实例化所选类。
确保使用Factories
中的输入键使数据库条目保持最新。
(我在代码示例中使用了一些C ++ 11。您可以在C ++ 03中使用更多代码执行相同的操作,不使用lambda表达式和std::function
,但是想法保持不变。)