gpt4 book ai didi

c++ - 从名称实例化类?

转载 作者:IT老高 更新时间:2023-10-28 12:44:58 25 4
gpt4 key购买 nike

想象一下,我有一堆 C++ 相关的类(都扩展了相同的基类并提供相同的构造函数),我在一个公共(public)头文件(我包含)中声明,以及它们在其他一些文件中的实现(我编译并作为我的程序构建的一部分静态链接)。

我希望能够通过名称实例化其中一个,这是一个必须传递给我的程序的参数(作为命令行或编译宏)。

我看到的唯一可能的解决方案是使用宏:

#ifndef CLASS_NAME
#define CLASS_NAME MyDefaultClassToUse
#endif

BaseClass* o = new CLASS_NAME(param1, param2, ..);

这是唯一有值(value)的方法吗?

最佳答案

这是一个通常使用 Registry Pattern 解决的问题。 :

This is the situation that the Registry Pattern describes:

Objects need to contact another object, knowing only the object’s name or the name of the service it provides, but not how to contact it. Provide a service that takes the name of an object, service or role and returns a remote proxy that encapsulates the knowledge of how to contact the named object.

这是相同的基本发布/查找模型 构成服务的基础 面向架构 (SOA) 和 OSGi 中的服务层。

您通常使用单例对象来实现注册表,单例对象在编译时或启动时被告知对象的名称以及构造它们的方式。然后您可以使用它来按需创建对象。

例如:

template<class T>
class Registry
{
typedef boost::function0<T *> Creator;
typedef std::map<std::string, Creator> Creators;
Creators _creators;

public:
void register(const std::string &className, const Creator &creator);
T *create(const std::string &className);
}

您可以像这样注册对象的名称和创建函数:

Registry<I> registry;
registry.register("MyClass", &MyClass::Creator);

std::auto_ptr<T> myT(registry.create("MyClass"));

然后我们可以用聪明的宏来简化它,使它能够在编译时完成。 ATL使用 CoClasses 的注册表模式,可以在运行时按名称创建 - 注册就像使用以下代码一样简单:

OBJECT_ENTRY_AUTO(someClassID, SomeClassName);

这个宏被放置在你的头文件中的某个地方,魔法使它在 COM 服务器启动时注册到单例中。

关于c++ - 从名称实例化类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1096700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com