1

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

从基类创建派生类,避免不必要的数据复制的最佳方法是什么?截至目前,我正在使用 base 的复制构造函数创建派生(如下所示):

class Base
{
};

class Derived : public Base
{
  Derived(const Base &base)
  : Base(base)
  {
  }
};

,但这需要复制所有不必要的基础数据——如果可能的话,我希望在不复制和删除它的情况下派生基类。

编辑:

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

4

2 回答 2

4

您说过您必须首先解析所有数据,而这个问题似乎向我建议您用来Base进行解析。(注意,随后的 OP 编辑​​已确认是这种情况。)

然后,一旦解析完成,您就可以根据已解析的数据构造Derived一个Base。这向我表明,这Derived不仅仅是一个解析器,而是解析数据的某种容器,以及解析数据的参与者。(也证实了。)

拥有一个既解析数据又包含解析数据并对其进行操作的类违反了单一职责原则。原则是要被打破的,但我认为在这种情况下违反它会给你带来麻烦。

我的建议是打破你的等级制度。

  • 一类是解析器,它自己不保存任何数据(可能用于解析状态除外)
  • 一个类包含原始的、已解析的数据,没有管理或参与者方法。也许就像一个简单的std::map.
  • 一类是演员,它处理数据。这实际上是一个类层次结构,对于不同类型的解析数据具有​​不同的类。

工作流程将是这样的:

  1. 实例化解析器。
  2. 解析器实例化原始数据的持有者,并解析数据。
  3. 解析器基于被解析的数据构造actor类,并将其传递shared_ptr给原始数据容器。
  4. 解析器终止,返回一个指向actor类的指针,该类现在拥有原始解析数据。
于 2013-06-07T13:08:20.387 回答
0

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

于 2013-06-07T13:01:01.617 回答