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

编辑:另外,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 可以使用这种技术在 .cpp 文件(而不是 .h 文件)中定义和声明私有对象。

于 2013-02-25T02:59:25.040 回答