gpt4 book ai didi

C++类类型数组

转载 作者:行者123 更新时间:2023-11-28 03:30:01 26 4
gpt4 key购买 nike

我正在从一个文件加载不同类型的派生类,它们的形式是:

  • 4 字节类 ID header
  • n字节序列化数据

每个类都继承自同一个基类,但我在优雅地创建它们时遇到了一些麻烦。这是我当前的代码(这里 Foo 和 Bar 是从同一类型继承的):

// read class ID
uint32_t id = ReadHeader(myFile);

// create correct class
switch (id)
{
case ID_CLASS_FOO: myClass = new Foo(myFile); break;
case ID_CLASS_BAR: myClass = new Bar(myFile); break;
/* ... */
}

但我发现这相当丑陋、乏味且容易出错,因为对于我添加的每个额外类,我都需要一个额外的定义/枚举成员,以及开关中的额外一行。

我正在寻找的是我会像这样声明编译时“类型数组”的东西:

ClassTypes = {Foo, Bar, ...};

然后,当读取文件时,就去:

myClass = new ClassTypes[id](myFile);

在 C++ 中有什么方法可以做到这一点吗?

最佳答案

您可以创建一个工厂类。

工厂定义:

typedef ClassType* (*ClassCreation(void))

class ClassFactory
{
private:
map<ClassId, ClassCreation> creators;

public:
ClassFactory()
{
creators[ID_CLASS_FOO] = &Foo::create;
creators[ID_CLASS_BAR] = &Bar::create;
}

ClassType* getClassType(ClassId id)
{
return (creators[id])()
}
};

class ClassType
{
//etc
};

class Foo : public ClassType
{
public:
static ClassType* create()
{
return new Foo;
}
};

class Bar : public ClassType
{
public:
static ClassType* create()
{
return new Bar;
}
};

工厂使用:

ClassFactory factory;

uint32_t id = ReadHeader(myFile);

ClassType* myClass = factory.getClassType(id);

关于C++类类型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12869295/

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