【发布时间】:2012-08-10 09:14:38
【问题描述】:
我有几个类(相同的基类),只有一些用户允许实例化一些。我需要在数据库中为用户保留允许的类。
我确实需要一些建议。因为我认为,我不需要在数据库中将类名列表作为字符串并在字符串比较的条件下实例化它们。我只是觉得不合适。
典型情况是
1. 调用 GetAllowedClassesToInstantiate(user) [来自数据库]
2. 实例化这些类
你有什么建议吗?
问候, 布拉克
【问题讨论】:
我有几个类(相同的基类),只有一些用户允许实例化一些。我需要在数据库中为用户保留允许的类。
我确实需要一些建议。因为我认为,我不需要在数据库中将类名列表作为字符串并在字符串比较的条件下实例化它们。我只是觉得不合适。
典型情况是
1. 调用 GetAllowedClassesToInstantiate(user) [来自数据库]
2. 实例化这些类
你有什么建议吗?
问候, 布拉克
【问题讨论】:
制作这样的数据结构:
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,但这个想法仍然存在一样。)
【讨论】: