1

基本クラスの関数の別の 1 つを介して基本クラスの関数に派生ポインターを送信しようとしていますが、何らかの理由でエラーが発生します: エラー: 8 行目の不完全な型 'struct Derived' の無効な使用。

#include <iostream>
using namespace std;
class Derived;

class Base
{
public:
    void getsomething(Derived *derived){derived->saysomething();} //This is line 8
    void recieveit(Derived *derived){getsomething(&*derived);}
};

class Derived : public Base
{
public:
    void giveself(){recieveit(this);};
    void saysomething(){cout << "something" << endl;}
};


int main()
{
    Base *b = new Base;
    Derived *d = new Derived;
    d->giveself();
    return 0;
}

どうすればこれを修正できるか知っていますか?

4

2 に答える 2

1

コンパイラがクラスのメンバーに関する情報を必要とする場合、前方宣言は使用できません。

前方宣言は、その名前のクラスが存在し、後で宣言および定義されることをコンパイラに伝える場合にのみ役立ちます。

次のようにしてください:

class Derived ;

class Base
{
public:
    void getsomething(Derived *derived); 
    void recieveit(Derived *derived);
};

class Derived : public Base
{
public:
    void giveself(){recieveit(this);};
    void saysomething(){cout << "something" << endl;}
};

void Base::getsomething(Derived *derived){derived->saysomething();} 
void Base::recieveit(Derived *derived){getsomething(&*derived);}
于 2013-09-20T16:12:27.717 に答える
0

唯一の方法は、クラス宣言から関数定義を取り出し、 の宣言の後に置くことですDerived。それらを使用しようとしている時点では、貧弱なコンパイラーはDerivedまだどのメソッドが存在するかさえ知りません。

于 2013-09-20T16:04:03.210 に答える