0

オートマトンの多くの状態のジェネリック クラスがあります。次のように宣言されています。

#ifndef STATE_H_
#define STATE_H_
#include "Automat.h"

class State {
public:
virtual void readChar(char c, Automat* automat) = 0;
virtual ~State(){};
};

#endif /* STATE_H_ */

私は日食でこのエラーを受け取ります:

この行に複数のマーカー

  • 'Automat* const' から 'int*' への引数 2 の既知の変換はありません</li>
  • virtual void State::readChar(char, int*)
  • 「Automat」は宣言されていません

私のオートマットは次のとおりです。

    #ifndef Automat_H_
    #define Automat_H_
    #include "../../Scanner/src/IScanner.h"
    #include "./States/State.h"

    class Automat {
    public:
        int count;
        State* current;
        IScanner* scanner;
        Automat(IScanner *s);
        void readChar(char c);
        void setState(State *s);
        void error();
        ~Automat();
    };

    #endif /* Automat_H_ */

最後に Automat の実装ですが、いくつかのメソッドを省略します。

#include "Automat.h"
#include "./States/StartState.h"


Automat::Automat(IScanner *s) {
    current = StartState::makeStartState();
    scanner = s;
    count = 0;
}

void Automat::readChar(char c) {
    current->readChar(c, this);
}

何が原因なのかわかりません。インターフェイスで何かを宣言する必要がありますか? なぜ引数を変換したいのですか?

よろしくお願いします。

4

2 に答える 2

6

両方のヘッダーが互いにインクルードしようとしますが、これは不可能です。

幸いなことに、どちらのクラス定義も他方の完全な定義を必要としません。それぞれは、宣言のみが必要な、他のポインターへのポインターのみを処理します。だから交換

#include "Automat.h"

class Automat;

についても同様ですState

于 2013-11-07T09:58:32.893 に答える