从基类对象创建派生类

Create derived class from base class object

本文关键字:派生 创建 对象 基类      更新时间:2023-10-16

我有基类,它是一些数据的通用解析器,我有多个派生类,它们为解析器中包含的数据提供特定的访问接口。只有在解析完所有数据之后,我才能确定派生类的类型,因为它取决于层次结构(有基类树,需要完全填充以确定每个基类的派生类)。

从基类创建派生类,避免不必要的数据复制的最好方法是什么?到目前为止,我正在使用base的复制构造函数创建派生函数(如下所示):
class Base
{
};
class Derived : public Base
{
  Derived(const Base &base)
  : Base(base)
  {
  }
};

,但这需要复制所有的基类数据,这是没有必要的-我希望基类在派生时不复制和删除它,如果可能的话。

编辑:

基解析器解析数据文件并将数据一般存储为map>,而派生类根据实际存储的数据类型提供特定的访问接口。派生类可以更改,可以添加更多。

您已经说过必须首先解析所有数据,这个问题似乎向我建议您使用Base进行解析。(注意,随后的OP编辑已经证实了这一点。)

然后,一旦解析完成,您将基于解析的数据从Base构造Derived。这向我表明,Derived不仅仅是一个解析器,而是某种容器的解析数据,以及对该解析数据的演员。(也证实。)

一个类既解析数据又包含解析数据并对其进行操作是违反单一责任原则的。原则就是用来打破的,但我认为在这种情况下违反它会给你带来问题。

我的建议是打破你的等级制度。
  • 一个类是解析器,它自己不保存任何数据(除了解析状态)
  • 一个类保存原始的、解析过的数据,没有管理方法或参与者方法。也许就像std::map一样简单。一个类是actor,它处理数据。这实际上是一个类层次结构,对于不同类型的解析数据有不同的类。

工作流程应该是这样的:

  1. 实例化解析器。
  2. 解析器为原始数据实例化一个holder,并解析数据。
  3. 解析器根据被解析的数据构造actor类,并将其传递给原始数据容器shared_ptr。解析器终止,返回一个指向actor类的指针,actor类现在拥有原始解析数据。

您可以为派生类提供它自己的构造函数,并只解析确定它所需的数据。传递指针也是一个好主意,因为它不涉及内存分配。