状态机,子类和功能指针

时间:2013-02-25 01:57:08

标签: c++ function-pointers state-machine subclass

我在为类实现状态机时遇到了麻烦。我一直在收到错误:

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),但这也不起作用。关于函数指针应该如何工作的任何澄清,特别是在子类成员函数的上下文中,我将非常感激。

编辑:另外,state.h文件中have0类声明末尾的Have0State声明究竟是什么?它没有明确规定的类型;是暗示它是Have0State ??

类型

1 个答案:

答案 0 :(得分:2)

您的示例中没有任何函数指针。另外,像Marciej一样,我能够编译(并运行)这段代码。

但是,既然你问过,'have0'声明只是声明了一个类的实例。类定义后面可以跟0个或更多这些声明(以及初始值设定项):

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

与任何其他类型相同:

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

这个可选的声明符列表的可能性是为什么必须使用分号跟随class,struct,union和enum定义(以终止列表)。

但是,正如Karthik所说,如果标头包含在多个.cpp文件中,则在标头中定义变量将在链接时导致“重复定义”错误。 IMO虽然使用这种技术来定义和声明.cpp文件中的私有对象(而不是.h文件),但这很好。