У меня проблемы с реализацией конечного автомата для класса. Я продолжаю получать ошибки:
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? У него нет явно определенного типа; это подразумевается, что это типа Have0State ??
В вашем примере нет указателей на функции. Также, как и Marciej, я могу скомпилировать (и запустить) этот код.
Но, как вы и просили, объявление ‘have0’ просто объявляет экземпляр класса. За определением класса может следовать 0 или более из этих объявлений (а также инициализаторов):
class Thing {...} one, another, many[3] = { Thing(1), Thing(2), Thing(3) };
так же, как и для любого другого типа:
int counter = 0, flag = 0x80, limit = 500;
Возможность этого необязательного списка объявлений является причиной того, что определения классов, структур, объединений и перечислений должны сопровождаться точкой с запятой (для завершения списка).
Но, как сказал Картик, определение переменной в заголовке приведет к ошибкам «дублированного определения» во время ссылки, если заголовок включен в несколько файлов .cpp. IMO это хорошо, хотя использовать эту технику для определения и объявления частных объектов в файле .cpp (а не в файле .h).
Других решений пока нет …