2

次のような状況があります

class B {
public:
    B() {};
    virtual ~B() {};
    virtual void seti( int x ) { i = x; };
    virtual void setj( int x ) { j = x; };
    virtual void add() =0;

protected:
    int i;
    int j;
};
class D :  public B {
public:
 virtual void add() { cout << "D-add:" << i + j << endl; }; 
};

class E: public B {
public:
    void seti( int x ) { i = x; };
    void add() { cout << "E-add:" << i + j << endl; }; 
    void mult() { cout << "E-mult:" << i * j << endl; }; 
};

int _tmain(int argc, _TCHAR* argv[])
{
    D *d = new D();
    d->seti(4); d->setj(5); d->add();
    E*e = d;
    e->seti(8); e->add(); e->mult();
    return 0;
}
次のエラーが表示されます
1>.\CallBack.cpp(38): エラー C2440: '初期化中': 'D *' から 'E *' に変換できません
1> 指されている型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または function-styl`enter code here`e キャストが必要です

私がやりたいことは、E をインスタンス化するときに、D のすべての情報/メンバーを使用して、さらに何かを行うことです。上記のような階層継承を使用する必要がありますか、または複数レベルの継承を使用する必要がありますか、それとも他に良い方法がありますか。お知らせ下さい。ありがとうございました !

4

5 に答える 5

3

あなたは変えることができます

class E: public B {

class E: public D {
于 2012-06-06T18:43:14.967 に答える
2

必要なのは「変換ctor」だと思います。これは、パラメーターとしてDへの参照/ポインターを受け取り、Dの値に基づいてそれ自体にデータを取り込むE上のコンストラクターです。Bで定義されたフィールドをコピーするには、次のようにします。

class B {
public:
....
  B(B& source) { this->i = source.i; this->j = source.j; }
....
}
class E {
public:
....
  E(D& source) : B(source) { // no need to do anything about i,j
  }
....
}

また、それを行う関数を持つコンバータークラス(DtoEConverter)を作成することもできます。

于 2012-06-06T18:42:11.973 に答える
2
D *d = new D();
d->seti(4); d->setj(5); d->add();
E*e = d;

dへのポインタDです。型が直接関連していないため、Dポインター先を取る変数にポインター先を割り当てることはできません。E

それらは基本クラスで関連していますが、d そうではありませんE。それが問題です。

あなたはこれを行うことができます:

B* e = d;

なぜならばd Bです。

ところで、あなたの質問のタイトルはこう尋ねます:

同じ基本クラスの2 つの派生オブジェクトはどのように通信できますか?

鉱山を強調します。派生オブジェクトは 2 つではなく、1 つしかありません。2 つのクラスがありますが、実際のオブジェクトをインスタンス化するのは 1 つだけです。

 D *d = new D();
于 2012-06-06T18:44:13.937 に答える
1

私は C++ プログラマーではありませんが、C シャープでできることに基づいて代替案を提供したいと考えています。

クラスDにインターフェースを追加する可能性があります....インターフェースIAddと言ってから、クラスDをクラスEに渡すことができます。

したがって、クラス E のコンストラクターでは、次のようなものを使用できます: public E(Interface x) .... X の代わりにクラス D を渡します。

これが役立つかどうか教えてください:)

よろしく

于 2012-06-07T09:19:00.130 に答える
1

メイン クラスをクラス間通信で汚染するのではなく、新しいクラスを導入します。

class DECommunicator
{
public:
  DECommunicator(D* dPtr, E* ePtr)
  {
    mDPtr = dPtr;
    mEPtr = ePtr;
  }

  void DSetI(int x)
  {
    mDPtr->setI(x);
  }

  // add additional methods to allow D to "talk" to E and vice versa

private:
  D* mDPtr;
  E* mEPtr;
}

あなたの例を考えると、あなたが何を達成しようとしているのかよくわからないので、コードを与えるのは難しいです。

于 2013-04-05T18:15:47.117 に答える