Прочитал бакалаврскую диссертацию с разными способами реализации конечного автомата на С++ и есть вопросы к куску кода. Когда я меняю метод StateTable::doNothing с публичного на защищенный, то доступ к StateTable::doNothing при инициализации CParser::myTable больше не работает. Компилятор выдает мне ошибку, что doNothing защищен в StateTable. Компилятору рекомендуется использовать doNothing из CParser. Но я не перегружал doNothing в CParser. Так почему я должен использовать CParser::doNothing вместо StateTable::doNothing? Заранее спасибо! Вот код:
class StateTable
{
public:
typedef void (StateTable::*Action)();
struct Tran
{
Action action;
unsigned nextState;
};
StateTable(Tran const *table, unsigned nStates, unsigned nSignals)
: myTable(table), myNsignals(nSignals), myNstates(nStates) {}
virtual ~StateTable() {}
void dispatch(unsigned const sig)
{
register Tran const *t = myTable + myState*myNsignals + sig;
(this->*(t->action))();
myState = t->nextState;
}
void doNothing() {}
protected:
unsigned myState;
private:
Tran const *myTable;
unsigned myNsignals;
unsigned myNstates;
};
enum Event {FEEDCHAR_SIG, EOL_SIG, RELEASE_SIG, MAX_SIG};
enum State {EMPTY, COLLECT, FULL, MAX_STATE};
class CParser : public StateTable
{
public:
CParser() : StateTable(&myTable[0][0], MAX_STATE, MAX_SIG) {}
void init()
{
count = 0; myState = EMPTY;
}
int getCount() const
{
return count;
}
private:
void a1()
{
count ++;
}
void a2()
{
count = 0;
}
static StateTable::Tran const myTable[MAX_STATE][MAX_SIG];
int count;
};
StateTable::Tran const CParser::myTable[MAX_STATE][MAX_SIG] =
{
{{static_cast<StateTable::Action>(&CParser::a1), COLLECT },
{&StateTable::doNothing, EMPTY },
{&StateTable::doNothing, EMPTY}},
{{static_cast<StateTable::Action>(&CParser::a1), COLLECT },
{static_cast<StateTable::Action>(&CParser::a2), FULL },
{&StateTable::doNothing, COLLECT }},
{{&StateTable::doNothing, FULL },
{&StateTable::doNothing, FULL },
{static_cast<StateTable::Action>(&CParser::a2), EMPTY }}
};
CParser
подсказывает Visual Studio - какая версия. - person Martin Bonner supports Monica   schedule 07.11.2016