gpt4 book ai didi

c++ - 在对象工厂中注册一个对象创建者

转载 作者:太空狗 更新时间:2023-10-29 23:38:22 32 4
gpt4 key购买 nike

我有一个方便的对象工厂模板,可以通过类型 ID 名称创建对象。实现非常明显:ObjectFactory 包含从 std::string 到对象创建函数的映射。然后所有要创建的对象都应该在这个工厂中注册。

我使用下面的宏来做到这一点:

#define REGISTER_CLASS(className, interfaceName) \
class className; \
static RegisterClass<className, interfaceName> regInFactory##className; \
class className : public interfaceName

RegisterClass 在哪里

   template<class T, class I>
struct RegisterClass
{
RegisterClass()
{
ObjectFactory<I>::GetInstance().Register<T>();
}
};

用法

class IFoo
{
public:
virtual Do() = 0;
virtual ~IFoo() {}
}

REGISTER_CLASS(Foo, IFoo)
{
virtual Do() { /* do something */ }
}

REGISTER_CLASS(Bar, IFoo)
{
virtual Do() { /* do something else */ }
}

类在工厂中同时定义和注册。

问题是 regInFactory... 静态对象是在 .h 文件中定义的,因此它们将被添加到每个翻译单元中。同一个对象的创建者会被多次注册,更重要的是,会出现大量冗余的静态存储时长的对象。

有没有什么办法可以进行如此优雅的注册(不是复制/粘贴类和接口(interface)名称),又不在全局范围内散布冗余静态对象?

如果一个好的解决方案需要一些 VC++ 特定的扩展(不符合 C++ 标准),我会同意的。

最佳答案

所以你想把变量定义放在头文件中?有一种可移植的方式:模板类的静态变量。所以我们得到:

template <typename T, typename I>
struct AutoRegister: public I
{
// a constructor which use ourRegisterer so that it is instantiated;
// problem catched by bocco
AutoRegister() { &ourRegisterer; }
private:
static RegisterClass<T, I> ourRegisterer;
};

template <typename T, typename I>
RegisterClass<T, I> AutoRegister<T, I>::ourRegisterer;

class Foo: AutoRegister<Foo, IFoo>
{
public:
virtual void Do();
};

请注意,我保留了 IFoo 的非虚拟继承。如果多次继承那个类有任何风险,它应该是虚拟的。

关于c++ - 在对象工厂中注册一个对象创建者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1310214/

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