我在为类实现状态机时遇到了麻烦。我一直在收到错误:
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 ??
答案 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文件),但这很好。