4

だから私はこれらのクラスを持っています。基本クラスは 1 つありますが、それには多くの派生物が含まれます (派生する予定です)。これらの派生クラスも派生物を持つことができます。バイナリ データをファイルに書き込む関数が必要ですが、大量の派生クラスでこれを行う方法がわかりません。

私は次のようなことを考えていました:

void writeData(ofstream & _fstream)
{
    _fstream.write()//etc..
}

しかし、このメソッドを実装した各派生クラスは、その親クラスのデータをすべて書き込む必要があり、それによって多くのコードが複製されます。

writeData()以前に記述したコードをすべて書き直さずにこれを行う最善の方法は何ですか?

4

4 に答える 4

9

派生クラスの実装から基本クラスの実装を呼び出すことができます。

void Derived::writeData(ofstream & _fstream)
{
    // Base class writes its data
    Base::writeData(_fstream);

    // now I can write the data that is specific to this Derived class
    _fstream.write()//etc..
}
于 2011-11-30T20:42:44.363 に答える
4

派生クラスはwrite、コードの重複を避けるために基本メソッドを呼び出すことができます。実際、一部の親のデータが非公開でありながら間接的に使用されている場合、これが唯一の方法かもしれません。

于 2011-11-30T20:43:42.283 に答える
1

シリアライゼーション関数のすべての派生クラスの実装を再設計することを避けたい場合は、ベースから派生クラスへの別の方向に進むことができます。

基本クラスで、シリアル化プロセスを開始するための非virtual関数を提供します。クライアント コードは、ポインター (または参照) を介してこの関数を呼び出します。サブクラスのシリアル化を行う仮想関数も提供します。基本クラスの関数からその関数を呼び出しSerializeます。

(編集) サブクラスをシリアル化するためのデフォルト機能を提供したいが、特定のケースに特化した機能を提供できるようにしたい場合、サブクラスをシリアル化する関数は純粋な仮想である必要はありません。ただし、OPを読んだところ、この機能を提供するにはすべてのサブクラスが必要になるように思えました。その要件をモデル化するために、DoSerializeここでは関数を純粋仮想にしました。

例:

class Base
{
public:
  void Serialize() const;
  virtual void DoSerialize() = 0;
};

class Derived : public Base
{
public:
  void DoSerialize() { /* MAGIC HAPPENS */ };
};

void Base::Serialize() const
{
  /* .. do serialization of base class here, or at the end -- whichever is appropriate .. */

  this->DoSerialize();  // serialize the derived class
}

/* ... */

Base* GetObject()
{
 /* ... */
}

int main()
{
  Base* obj = GetObject();
  obj->Serialize();
}
于 2011-11-30T20:46:35.697 に答える
0

最終的に、適切にシリアル化されていることを確認するのは、各派生クラスの責任です。派生クラスは、その目的に応じて、基本クラスの前または後に一部のデータをシリアル化する必要がある場合があります。また、基本クラスのデータをシリアル化する方法を完全にオーバーライドすることもできます。

このように見てください。ここで実行されている機能は、シリアライゼーションとデシリアライゼーションです。ここで重要なことは、正しく実行する必要があるということです。したがって、これを行うのに適したクラスは、完全な知識を持つクラスだけです。つまり、派生クラスです。

そのため、Base::writeData() を呼び出さなければならない場合もありますが、それを行うかどうかは完全に派生クラスに任せるべきです。必要なのは、クラス階層がいくつかの基本的な設計原則を満たすことです。それができたら、それは比較的簡単なはずです。

于 2011-11-30T21:14:10.707 に答える