C ++でのBi Directionの関連付け

私は2つのクラスを定義しようとしています

class state03: public state
{
public:
    std::string name;   
    state03(bool inAcceptState, bool inRejectState)
    {
        setRejectState(inRejectState);
        setAcceptState(inAcceptState);
        name="State 03";
    }

    state * evalNextState(char input)
    {
         if(input==' ')
        {
            return this;
        }
         if(isalpha(input) || input=='_')
         {
             return new state04(false,false);
         }
        return new RejectState();
    }
};

class state04: public state
{
public:
    std::string name;
    state04(bool inAcceptState, bool inRejectState)
    {
        setRejectState(inRejectState);
        setAcceptState(inAcceptState);
        name="State 04";
    }
    state * evalNextState(char input)
    {
        if(isalnum(input) || input=='_')
        {
            return this;
        }
        if(input==',')
        {
            return new state03(false,false);
        }
        return new RejectState();
    }
};

コンパイラはコードをトップからボトムまでスキャンするので、class state03はクラスstate03の後に定義されるので、このコンパイルエラーはクラスstate04が未定義です...

どのように私は双方向の関係を達成することができますか?

1
追加された
ビュー: 1

2 答え

実装の詳細を別のファイルに移動する必要があります。その場合は、最も簡単で簡単な方法です。

state03.h

class state03 : public state {
  //...
   state * evalNextState(char input);
}

state04.h

class state04 : public state {
  //...
}

state03.cpp

#include "state03.h"
#include "state04.h"

state * state03::evalNextState(char input) {
   //your code here
}
4
追加された
user1043565:宣言と実装を分離するだけで適切な方法です。私は答えからフォワード宣言を削除しましたが、引数を使って state04 コンストラクタを呼び出すので、実際にはあなたのケースには当てはまりません。したがって、 state04 を宣言すると、無効な型の無効な使用というエラーが発生します。
追加された 著者 netcoder,
@ user1043565:更新されたコードを質問に追加できますか?これが適切に行われていれば起こらないはずです。
追加された 著者 netcoder,
前方宣言を試しましたが、実際に定義する前にクラスのコンストラクタを使用しているので、別のコンパイルエラーが発生します。
追加された 著者 user1043565,
ヘッダーファイルのメソッド実装がうまくいかなかったとき、私はこのエラーを受け取りました。 "これは非静的メンバー関数の中でのみ参照できます"。何か案は?
追加された 著者 user1043565,
ありがとうございます、私はメソッド定義で作業中のクラスを指定していませんでした。これは、コンパイラが新しいメソッドを静的ブロックとして認識することです。
追加された 著者 user1043565,

実装をクラス定義から取り出し、実装ファイルに移動します。

0
追加された