从基类对象创建派生类
Create derived class from base class object
我有基类,它是一些数据的通用解析器,我有多个派生类,它们为解析器中包含的数据提供特定的访问接口。只有在解析完所有数据之后,我才能确定派生类的类型,因为它取决于层次结构(有基类树,需要完全填充以确定每个基类的派生类)。
从基类创建派生类,避免不必要的数据复制的最好方法是什么?到目前为止,我正在使用base的复制构造函数创建派生函数(如下所示):class Base
{
};
class Derived : public Base
{
Derived(const Base &base)
: Base(base)
{
}
};
,但这需要复制所有的基类数据,这是没有必要的-我希望基类在派生时不复制和删除它,如果可能的话。
编辑:基解析器解析数据文件并将数据一般存储为map>,而派生类根据实际存储的数据类型提供特定的访问接口。派生类可以更改,可以添加更多。
您已经说过必须首先解析所有数据,这个问题似乎向我建议您使用Base
进行解析。(注意,随后的OP编辑已经证实了这一点。)
然后,一旦解析完成,您将基于解析的数据从Base
构造Derived
。这向我表明,Derived
不仅仅是一个解析器,而是某种容器的解析数据,以及对该解析数据的演员。(也证实。)
一个类既解析数据又包含解析数据并对其进行操作是违反单一责任原则的。原则就是用来打破的,但我认为在这种情况下违反它会给你带来问题。
我的建议是打破你的等级制度。- 一个类是解析器,它自己不保存任何数据(除了解析状态) 一个类保存原始的、解析过的数据,没有管理方法或参与者方法。也许就像
std::map
一样简单。一个类是actor,它处理数据。这实际上是一个类层次结构,对于不同类型的解析数据有不同的类。工作流程应该是这样的:
- 实例化解析器。
- 解析器为原始数据实例化一个holder,并解析数据。 解析器根据被解析的数据构造actor类,并将其传递给原始数据容器
shared_ptr
。解析器终止,返回一个指向actor类的指针,actor类现在拥有原始解析数据。您可以为派生类提供它自己的构造函数,并只解析确定它所需的数据。传递指针也是一个好主意,因为它不涉及内存分配。
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何使用"derived input class"创建派生类?
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 创建派生自可变参数模板包的类型元组
- 在没有默认构造函数的情况下创建的派生对象
- 如何创建派生对象的向量?
- 与简单地创建派生类指针相比,将基类绑定到派生类有什么优点?
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 在基类中创建派生类的对象
- 根据参数创建派生类的新实例
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 受保护的析构函数禁用在堆栈上创建派生类的对象?
- 如何从一组派生类创建列表?
- 是否有可能有一个派生类继承最终函数但创建相同的函数(而不是重写)
- 如何创建指向派生类的新指针,该派生类在C++编译时未知
- 如何在C 中创建Logic_error的自定义派生类
- 将使用基类 Ctor创建的对象转换为派生类
- GStreatermm:通过从Gst::element派生创建一个新的元素类型(在插件中)
- 基类的shared_pointer不能使用多态派生创建