4

object と object_manager の 2 つのクラスを作成したいのですが、お互いをどのように認識/インクルードするかについて混乱しています。2 つのヘッダーが互いにインクルードすることは禁止されており、コードの依存関係に円がある場合、それは不適切なコード設計であり、通常は階層構造 (町 -> 家 -> 家具と家具は知らない) のようになるはずだと聞いたことがあります。町の存在について)。

しかし、ここでは、すべてのオブジェクトを認識して保持する object_manager があり、オブジェクトには新しいオブジェクトを作成するオプションが必要ですが、次に object_manager を呼び出す必要があります。構造、悪いです..

これは、あるプロセスが OS システム コールを呼び出して新しいプロセスを作成したいようなもので、OS とプロセスはお互いを認識しています。

これを正しいコード設計で実装できる方法はありますか、それとも悪い場合もありますか??

オブジェクトには、すべての「システムコール」を保存する特別な場所が必要であり、object_manager が時々それをチェックする必要があると思いました..しかし、もっと良い方法があるかもしれません。

4

6 に答える 6

0

あなたが説明しているのは、別のオブジェクト内にのみ存在できるオブジェクトです。

これを実装する良い方法は、ネストされたクラスを使用することです。

class object_manager {
  public:
  class object {  // object_manager::object. public allows it to be used outside of manager
    public:
    void foo() {
      object* t = construct(); // can call object_manager methods
    }
  };

  private:
  object my_objects[5]; // can create objects
  static object* construct() { return NULL; }
};

object と object_manager 用に 2 つの cpp ファイルを使用できることに注意してください。

于 2011-10-21T21:45:25.223 に答える
0

CPPファイルは、コンパイルの問題を引き起こすことなく、互いのヘッダーを含めることができます (設計の観点から正しいかどうかは別の問題ですが、あなたの場合は問題ないはずです)。これは、お互いのメソッドなどを呼び出すことができることを意味します。

ヘッダーファイルに関しては、「オブジェクト マネージャー」クラスは「オブジェクト」クラス インスタンスと連携する必要があるため、「オブジェクト マネージャー」ヘッダーには「オブジェクト」ヘッダーが含まれる可能性が高くなります。「オブジェクト」ヘッダー ファイルが「オブジェクト マネージャー」クラスについて知る必要がある場合は、「オブジェクト」ヘッダー ファイルに「オブジェクト マネージャー」の前方宣言を配置します。そうすれば、循環インクルード依存関係を作成せずに、「オブジェクト」ヘッダー ファイルで「オブジェクト マネージャー」へのポインターと参照を使用できます。

于 2011-10-21T21:29:52.927 に答える
0

ヘッダー間の結合を削除するための一般的な推奨事項は次のとおりです。

フォワード できることを宣言します。A クラスは、参照またはポインターを渡すことによってのみ、他のクラス (X、Y、..) を使用することがあります。したがってA.h、コンパイラが完全な型を知る必要なく、これらの X、Y の戻り値または引数の型を使用するメソッドを宣言できます。つまりA.h、含める必要がないことを意味しX.hますY.h

PImpl イディオムを使用します。実装をインターフェイスから切り離す (仮想クラスまたは抽象クラスを使用せずに) 最善の方法は、次のようなことです。


フー。

class Foo {
struct Impl;
Impl* m_impl;

public:
Foo();
void SomeMethod();

}

Foo.cpp

#include "X.h"
struct Foo::Impl {
/* actual implementation */
...};

Foo::Foo() : m_impl( new Foo::Impl() ) {};

void Foo::SomeMethod() {
m_impl->SomeMethod();
}
于 2011-10-21T21:30:46.043 に答える