0

なぜ私は作ることができないl->set(new StateB);のですStateAか? (この行は下にコメントされています)

それは言います:

main.cpp: In member function ‘virtual void StateA::writeName(Lap*, char*)’:
main.cpp:19:4: error: invalid use of incomplete type ‘struct Lap’
main.cpp:3:7: error: forward declaration of ‘struct Lap’

しかし、私はそれを解決できません:(

#include <stdio.h>

class Lap;
class State;
class StateB;
class StateA;

class State { public:
    virtual void writeName(Lap *l, char *str) = 0;
};
class StateB : public State { public:
    void writeName(Lap *l, char *str) {
        printf("%s B\n", str);
    }
};
class StateA : public State { public:
    void writeName(Lap *l, char *str) {
        printf("%s A\n", str);
        //l->set(new StateB);
    }
};
class Lap { public:
    State *ss;
    Lap(){
        printf("[Lap]\n");
        set(new StateA);
    }

    void set(State *s){
        ss = s;
    }

    void writeName(char *str){
        ss->writeName(this, str);
    }
};

int main()
{
    printf("\n\n");

    Lap lap;
    lap.writeName((char*)"Fulano");
    lap.writeName((char*)"Fulano");

    printf("\n\n");
    return 0;
}
4

1 に答える 1

3

問題は、前方宣言が

class Lap;

そのようなクラスが存在することをコンパイラに通知し、へのポインタを宣言できるようにするだけですが、メソッド呼び出しLapを処理するのに十分な情報をコンパイラに提供しません。Lap

したがって、そのメソッドを使用する前に、Lap 完全に宣言しておく必要があります。

与えられたコードでは、これを単一のファイルで行うことはできませんLap。これは、循環依存のメソッドnew StateAStateA呼び出すときに行うためです。Lap

少なくとも1つ(さらにはすべて)の宣言をヘッダーファイルに移動し、必要に応じてヘッダーをインクルードする必要があります。次に、コンパイラは、いずれかのクラスの定義が他のクラスのメソッドを使用しようとする前に、クラスの完全なインターフェイスの詳細を認識します。

于 2012-05-23T00:02:31.723 に答える