1

一部のデータの汎用パーサーである基本クラスがあり、パーサーに含まれるデータへの特定のアクセス インターフェイスを提供する複数の派生クラスがあります。派生クラスのタイプは、階層に依存するため、すべてのデータが解析された後にのみ決定できます (基本クラスのツリーがあり、各ベースの派生クラスを決定するために完全に設定する必要があります)。

データの不必要なコピーを避けて、基本クラスから派生クラスを作成する最良の方法は何ですか? 今のところ、ベースのコピーコンストラクターを使用して派生を作成しています(以下のように):

class Base
{
};

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

、しかし、これには必要のないすべての基本データをコピーする必要があります-可能であれば、基本クラスをコピーして削除せずに派生させたいです。

編集:

ベース パーサーはデータ ファイルを解析し、データを一般的に map > として保存します。一方、派生クラスは、保存された実際のデータ型に応じて特定のアクセス インターフェイスを提供します。派生クラスは変更される可能性があり、さらに追加される可能性があります。

4

2 に答える 2

4

あなたは最初にすべてのデータを解析しなければならないと言いましたが、質問はあなたBaseが解析を行うために使用することを示唆しているようです。(注、その後のOP編集でこれが事実であることが確認されました。)

次に、解析が完了したら、解析されたデータに基づいてを構築Derivedします。これは、単なるパーサーではなく、解析されたデータの何らかのコンテナーであり、解析されたデータのアクターであるBaseことを示唆しています。Derived(こちらも確認済み)

データを解析し、解析されたデータを含み、それに基づいて動作する 1 つのクラスを持つことは、単一責任の原則に違反します。原則は破られることを意図していましたが、この場合、違反すると問題が発生すると思います。

私の提案は、ヒエラルキーを分解することです。

  • 1 つのクラスはパーサーであり、独自のデータを保持しません (状態の解析を除く)。
  • 1 つのクラスは、管理またはアクター メソッドを使用せずに、生の解析済みデータを保持します。おそらく、と同じくらい簡単std::mapです。
  • 1 つのクラスは、データを操作するアクターです。これは実際にはクラス階層であり、解析されたデータの種類ごとに異なるクラスがあります。

ワークフローは次のようになります。

  1. パーサーをインスタンス化します。
  2. パーサーは生データのホルダーをインスタンス化し、データを解析します。
  3. パーサーは、解析されたデータに基づいてアクター クラスを構築shared_ptrし、生データ コンテナーに渡します。
  4. パーサーが終了し、アクター クラスへのポインターが返されます。アクター クラスは、生の解析済みデータを所有しています。
于 2013-06-07T13:08:20.387 に答える
0

派生クラスに独自のコンストラクターを提供し、それを判断するために必要なデータのみを解析できます。ポインターを渡すことも良い考えです。これは、メモリ割り当てを必要としないためです。

于 2013-06-07T13:01:01.617 に答える