0

クラスのステート マシンの実装に問題があります。エラーが発生し続けます:

state.cpp:5: error: have0 was not declared in this scope 
state.cpp:10: error: redefinition of State* Have0State::process(std::string)
state.h:18: error: virtual State* Have0State::process(std::string) previously defined here

マシンの残りの部分に進む前に、Have0State を機能させようとしているため、スパース コードです。

状態.h:

#ifndef STATE_H
#define STATE_H

#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <iostream>


class State{
    public:
        State(){};
        virtual State* process(std::string input) = 0;


};
class Have0State: public State {
    public:
        Have0State():State(){};
        virtual State* process(std::string input);
}have0;
#endif

状態.cpp:

#include "state.h"

using namespace std;
State *currentState = &have0;

State* Have0State::process(string input){
    if(input == "quarter"){
        cout << "cool" << endl;
    }
    return &have0;
}

int main(int argc, char** argv) {
    string input;
    //get input
    cin >> input;
    while (input != "exit") {
        currentState = currentState->process(input);
        //get input
        cin >> input;

    }
    return 0;
};

プロセス関数を次のように定義しようとしましHave0State::State::process(string input)たが、それも機能しませんでした。特にサブクラスメンバー関数のコンテキストで、関数ポインターがどのように機能するかについての説明があれば、大いに感謝します。

EDIT:また、state.hファイルhave0のクラス宣言の最後の宣言は正確には何ですか? Have0State明示的に指定された型はありません。タイプ Have0State であることが暗示されていますか??

4

1 に答える 1

2

あなたの例には関数ポインタはありません。また、Marciejのように、私はこのコードをコンパイル(および実行)することができます。

しかし、あなたが尋ねたので、'have0'宣言は単にクラスのインスタンスを宣言します。クラス定義の後には、これらの宣言(および初期化子)の0個以上を続けることができます。

class Thing {...} one, another, many[3] = { Thing(1), Thing(2), Thing(3) };

他のタイプと同じ:

int counter = 0, flag = 0x80, limit = 500;

このオプションの宣言子リストの可能性は、クラス、構造体、共用体、および列挙型の定義の後にセミコロンを付ける必要がある理由です(リストを終了するため)。

ただし、Karthikが述べたように、ヘッダーが複数の.cppファイルに含まれている場合、ヘッダーで変数を定義すると、リンク時に「重複定義」エラーが発生します。IMOでも、この手法を使用して、(。hファイルではなく).cppファイルでプライベートオブジェクトを定義および宣言することは問題ありません。

于 2013-02-25T02:59:25.040 に答える