我有基类,它是某些数据的通用解析器,我有多个派生类,它们为解析器中包含的数据提供特定的访问接口。我只能在解析所有数据后确定派生类的类型,因为它取决于层次结构(有基类树,需要完全填充以确定每个基类的派生类)。
从基类创建派生类的最佳方法是什么,避免不必要的数据复制?截至目前,我正在创建使用base的复制构造函数派生(如下所示):
class Base
{
};
class Derived : public Base
{
Derived(const Base &base)
: Base(base)
{
}
};
,但这需要复制所有必要的基础数据 - 我希望基类在不复制的情况下派生,如果可能的话删除它。
编辑:
基本解析器解析数据文件并将数据存储为map>,而派生类根据存储的实际数据类型提供特定的访问接口。派生类可能会更改,可以添加更多类。
答案 0 :(得分:4)
您已经说过必须首先解析所有数据,而这个问题似乎告诉我您使用Base
进行解析。 (注意,随后的OP编辑已经确认了这种情况。)
然后,一旦解析完成,您将根据解析的数据从Derived
构造Base
。这告诉我Derived
不仅仅是一个解析器,而是解析数据的某种容器,以及解析数据的一个actor。 (也证实了。)
有一个既解析数据又包含解析数据并对其采取行动的类违反了Principle of Single Resposibility。原则意图被打破,但我认为在这种情况下违反原则会给你带来麻烦。
我的建议是打破你的层次结构。
std::map
一样简单。工作流程将是这样的:
shared_ptr
传递给原始数据容器。答案 1 :(得分:0)
您可以为派生类提供自己的构造函数,并仅解析确定它所需的数据。传递指针也是一个好主意,因为它不涉及内存分配。