2016-04-27 1 views
0

ここには最小の例があります。私はDerivingクラスを知る必要があるBaseクラスを持っています。次にDerivingクラスはBaseクラスを知る必要があります。どうやって定義すれば、互いの存在を知ることができますか? error: 'Deriving' does not name a typeBase最初のリード線の定義:ここでオブジェクトを派生させるポインタを持つ基底クラス:お互いの存在の両方をどのように伝えるか?

class Base { 
    Deriving* d; 
public: 
    Base(Deriving* deriving) { 
    d = deriving; 
    } 
    void f() { 
    d->g(); 
    } 
}; 

class Deriving : public Base { 
public: 
    Deriving() : Base(this) {} 
    g(); 
}; 

は、私が試したし、どのようなコンパイラが言ったことです。 Derivingを定義すると、最初にerror: expected class-name before '{' tokenになります。不完全なタイプのBaseまたはDerivingを宣言すると、error: invalid use of incomplete type 'class X'になります。私は他に何を試していいのかわかりません。

ご協力いただきまして誠にありがとうございます。

+0

なぜそれが理由だけ」へのポインタを取らない、「導出」を知っておく必要がありませんベース*"? – kfsone

+0

私のプログラムでは、ある理由のために、同じDerivingオブジェクトを指す多くのBaseオブジェクトが存在することがあります。 – mak

+0

*オブジェクト*インスタンスまたはクラス定義を意味しますか? – kfsone

答えて

2

ベースでは、機能fはクラスDerivingの定義を知る必要があるため、Derivingが定義された後に定義してください。

class Deriving; 

class Base { 
     Deriving* d; 
    public: 
     Base(Deriving* deriving) { 
     d = deriving; 
     } 
     void f(); 
}; 

class Deriving : public Base { 
    public: 
     Deriving() : Base(this) {} 
     void g(); 
}; 

void Base::f() 
{ 
    d->g(); 
} 
0

この種の配列は、通常論理エラーです。基本クラスは、派生クラスについて何も知る必要はありません。基本クラスのメソッドが、派生クラスに格納されることになるアセットを使用する必要がある場合、それらのアセットへの参照を関数f()に渡すことができます。

上記の例では、目的の動作が継承で達成することができる。このような

何か:

class Base 
{ 
public: 
    void f() { 
    impl_f(); 
    } 
private: 
    virtual void impl_f() = 0; 
}; 

class Derived : public Base 
{ 
private: 
    void impl_f() override 
    { 
    // whatever g() was going to do... 
    } 
}; 
関連する問題