2

これが私のジレンマです。

私は基本クラスを持っています(一般的なPersonクラスとしましょう):

class Person{
public:
    Person();
    ~Person();
    virtual void Init();
    virtual void SaySomething();
};

ここで、他のクラスにこれらのメソッドを継承させたいと思います。

class Worker: public Person{
public:

   Worker();
   ~Worker();

   void Init(){
     // would do some special initializing.
   }

   void SaySomething(){
     // Print something about the worker.
   }

};

今、私はマネージャークラスを持っているでしょう:

class Manager{
public:

   void Init();
   void Run();

   void SwitchPerson(Person* p);

protected:
   vector<Person*> people;
};

ワーカーがPersonの子クラスである場合の例は、おそらく最良ではありません。しかし、重要なのはクラスの内容ではなく、継承であり、より具体的には、クラスが他のクラスをどのように理解し、知っているかです。

今私の主な機能では、私は次のようになります:

int main()
{
  Manager* m = new Manager();
  m->Init();

  // Create a new worker;
  Person* w = new Worker();

  m->SwitchPerson(w);

  return 0;
}

これが問題に取り組む正しい方法であるかどうかはわかりません。問題は、子クラスが無制限に存在する可能性があり、マネージャークラスがそれらについて知ることができないことです。managerクラスは、親(Person)クラスについてのみ知っています。したがって、SwitchPersonは、タイプPersonの新しいWorkerクラスをベクトルに追加します(これが構造的に正しくないかどうかはわかりませんが、正しいと感じています)。ただし、最初に、ベクターにワーカークラスがすでに存在しないことを確認する必要があります。typeid.nameを使用してみましたが、これは明らかに親(Person)クラスの名前を返します。

ベクトル付きのテンプレートを使用することを考えましたが、これもマネージャークラスがワーカーまたは他の子クラスについて知っている必要があります。

他に何か説明したり、関連情報を追加したりする必要がある場合は、お知らせください。

編集:

注:Person、Worker、およびManagerという用語は関係ありません。重要なのは、カメラ、レンズ、ステージです。

SwitchPerson:

一度にアクティブにできるのは1人だけだとしましょう。カメラ、レンズ、ステージの例えでさらに意味があります。1台のカメラだけが画面に移動できるので、言うことができます。

カメラの例えを維持しているとしましょう。最初のシーンがあり、最初にSwitchCamera()を呼び出して、新しいCameraを渡します。しかし、問題は、Stageオブジェクト(マネージャーになる)がレンズまたはさまざまなタイプのレンズについて知らないことです。100または10000の可能性があります。それは問題ではありません。シーンは、すべてのレンズクラスの基本クラスであるカメラについてのみ知っています。

したがって、switchCamera()を使用すると、オブジェクトを使用してレンズを制御できます(あまり現実的ではありませんが、何でも)。すべてのコントロールは、最初にCamera基本クラス内の仮想メンバーとして実装されます。したがって、レンズクラスはすべて同じメンバーを持っています。

これで最初のシーンが終了し、カメラをもう一度切り替えたいと思います。もう一度SwitchCamera()を呼び出して、新しい2番目のカメラを渡します。スイッチカメラの目標は、渡されたカメラオブジェクトをアクティブなカメラとして設定し、それをベクトルにプッシュすることです。

しかし、同じレンズの2つのコピーは必要ありません。ここに問題があります。渡されたCamera*camera = new Lense123();かどうかを確認できるようにしたい。すでにベクトル内にあります。もしそうなら、私は元のものを使用し、新しく渡されたものを破棄したいと思います。

4

2 に答える 2

3

Managerに一意のPersonのベクトルを持たせたいようです。つまり、Worker、Person、ThirdPersonを含めることができますが、ベクトルにはそれぞれ1つしか含めることができません。サブクラスの文字列ラベルを返すPersonの関数をオーバーロードし、それぞれに対してpPerson-> GetLabel()を呼び出してベクトルを反復処理し、それをベクトルに追加しようとしている新しいオブジェクトのラベルと比較してみませんか。 。

Managerは、Personクラスについてのみ知っており、Personのさまざまなサブクラスについて何も知る必要はありませんが、各タイプから一意の文字列を取得できます。

于 2012-06-14T04:18:52.377 に答える
0

マネージャーは人であり、マネージャーには人がいません。私はPersonからManagerを継承し、Managerには1 ... N人の従業員がいるので、最善の方法は次のとおりです。PersonからManagerを継承するManagerにベクトルを設定します。クラスPersonを仮想化するので、誰も「Person」を実装できませんでした

于 2012-06-14T03:59:23.143 に答える