Конечные автоматы, подклассы и указатели функций

У меня проблемы с реализацией конечного автомата для класса. Я продолжаю получать ошибки:

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 ??

0

Решение

В вашем примере нет указателей на функции. Также, как и 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).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]