2013-02-25 85 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文件)。