1

ここにstate_machine.hがあります:

#ifndef STATE_MACHINE_H
#define STATE_MACHINE_H

// state machine classes

//#include "state_t.h"
class state_t;

class state_machine
{

public:
    state_machine();
    void change_state(state_t *newState);
    void process_state(int data);

private:
    state_t *_state;
};

#endif // STATE_MACHINE_H

そして、これがstate_t.hです:

#ifndef STATE_T_H
#define STATE_T_H

#include <QByteArray>
#include <QDebug>

//#include "state_machine.h"
class state_machine;

class state_t
{
public:
    state_t(QByteArray stateName);
    virtual ~state_t();
    virtual void processState(state_machine *sm, int input) = 0;

    void defaultUnknownEventHandler(int event);

    QByteArray name;
};

#endif // STATE_T_H

次に、多かれ少なかれすべて同じであるいくつかの状態クラスを、1 つだけリストします。

teststate1.h:

#ifndef TESTSTATE1_H
#define TESTSTATE1_H

#include "state_t.h"

class testState1 : public state_t
{
public:
    testState1();
    void processState(state_machine *sm, int event);
};

#endif // TESTSTATE1_H

teststate.cpp:

#include "teststate1.h"
#include "teststate2.h"

testState1::testState1() :
    state_t("state1")
{
}

void testState1::processState(state_machine *sm, int event)
{
    qDebug() << name << ": event" << event;
    switch (event)
    {
        case 2:
        {
            // error: invalid use of incomplete type 'class state_machine'
            sm->change_state(new testState2()); 
            break;
        }
        default:
        {
            defaultUnknownEventHandler(event);
            break;
        }
    }
}

問題:

コードを整理し、前方宣言を使用して (特にヘッダー ファイルで) 最小限のヘッダー インクルードを使用しようとしています。state_machine クラス ヘッダーで、コメント アウト#include "state_t.h"して前方宣言に置き換えたことがわかりclass state_t;ます。これは機能し、私のコードはコンパイルされて実行されました。

次に、state.h を#include "state_machine.h"forward 宣言に置き換えましたclass state_machine;(コメントアウトした場所を確認できます)。

しかしerror: invalid use of incomplete type 'class state_machine'、testState1.cpp コードでコメントしたエラーが表示されます。しかし、理由はわかりません。state_machine が不完全な型であるのはなぜですか?

4

1 に答える 1

4

teststate.cppの定義が必要state_machineです。そこに含めstate_machine.hます。

「不完全」とは、コンパイラがclass state_machine;完全な定義ではなく、宣言のみを見たことを意味します。ポインターや参照の宣言など、不完全な型でさまざまなことを行うことができます。ただし、完全な定義なしでは、(ここで行うように) メンバー関数を呼び出すことはできません。また、より一般的には、クラス メンバーの知識を必要とすることを行うことはできません。

于 2013-10-31T09:42:04.257 に答える