我在爲類實現狀態機時遇到問題。我不斷收到錯誤:狀態機,子類和函數指針
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工作之前,我繼續到機器的其餘部分,因此稀疏代碼。
state.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
state.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)
但也不能工作。關於函數指針應該如何工作的任何澄清,特別是在子類成員函數的上下文中,我將不勝感激。
編輯:另外,什麼是have0
聲明Have0State
類聲明在state.h文件結束?它沒有明確說明的類型;是否暗示它是HaveOState類型?
have0定義似乎與C中有時定義結構變量類似。非常罕見,並且稍後會導致問題(標頭中的變量總是會這樣做),所以您應該將它移到別處。 – 2013-02-25 02:12:13
在'state.h'的定義末尾是否有'{}'?否則重構'have0',看看它是否有幫助。 – 2013-02-25 02:15:15
您確定您向我們展示了與產生錯誤的代碼完全相同的代碼嗎?我只是將代碼(頭文件的內容和頭文件下面的cpp文件的內容,忽略了'#ifndef'後衛)粘貼到在線編譯器中,並且它編譯得很好。 – 2013-02-25 02:17:01