gpt4 book ai didi

c++ - 根据参数在基类中创建派生类

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:00 25 4
gpt4 key购买 nike

我的问题或多或少与 Need a design pattern to remove enums and switch statement in object creation 中的问题相同但是,我认为抽象工厂模式不适合这里。

我目前正在计划重构/重新实现一些现有的 DAL/ORM 混合库。在现有代码的某处,有如下所示的代码:

class Base
{
static Base * create(struct Databasevalues dbValues)
{
switch(dbValues.ObjectType)
{
case typeA:
return new DerivedA(dbValues);
break;
case typeB:
return new DerivedB(dbValues);
break;
}
}
}

class DerivedA : public Base
{
// ...
}

class DerivedB : public Base
{
// ...
}

因此负责数据库通信的库将有关数据库实体的所有信息填充到一个结构中,然后调用上面的 create() 方法以在 ORM 中实际创建相应的对象。但是我不喜欢基类知道它的所有派生类的想法,我也不喜欢 switch 语句。我还想避免仅仅为了创建这些对象而创建另一个类。您如何看待当前的方法?您将如何实现此功能?

最佳答案

这已经在这里讨论了数百万次。如果不想创建单独的工厂类,可以这样做。

class Base
{

public:
template <class T>
static void Register (TObjectType type)
{
_creators[type] = &creator<T>;
}

static Base* Create (TObjectType type)
{
std::map <TObjectType, Creator>::iterator C = _creators.find (type);
if (C != _creators.end())
return C->second ();

return 0;
}

private:
template <class T>
static Base* creator ()
{
return new T;
}

private:
typedef Base* (::*Creator) ();
static std::map <TObjectType, Creator> _creators;
};

int main ()
{
Base::Register <Derived1> (typeA);
Base::Register <Derived2> (typeB);

Base* a = Base::Create (typeA);
Base* b = Base::Create (typeB);
}

关于c++ - 根据参数在基类中创建派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13292856/

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