2013-02-25 83 views
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工作之前,我繼續到機器的其餘部分,因此稀疏代碼。

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類型?

+1

have0定義似乎與C中有時定義結構變量類似。非常罕見,並且稍後會導致問題(標頭中的變量總是會這樣做),所以您應該將它移到別處。 – 2013-02-25 02:12:13

+1

在'state.h'的定義末尾是否有'{}'?否則重構'have0',看看它是否有幫助。 – 2013-02-25 02:15:15

+0

您確定您向我們展示了與產生錯誤的代碼完全相同的代碼嗎?我只是將代碼(頭文件的內容和頭文件下面的cpp文件的內容,忽略了'#ifndef'後衛)粘貼到在線編譯器中,並且它編譯得很好。 – 2013-02-25 02:17:01

回答

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文件中,在標題中定義一個變量將導致鏈接時出現「重複定義」錯誤。國際海事組織它是好的,但使用這種技術來定義和聲明私人對象在.cpp文件(而不是.h文件)。