我读了一篇学士论文,用不同的方法用c ++实现状态机,对一段代码有疑问。 当我将方法StateTable :: doNothing从public更改为protected时,在CParser :: myTable的初始化中对StateTable :: doNothing的访问不再起作用。编译器给出了一个错误,即在StateTable中doNothing受到保护。编译器建议是使用CParser中的doNothing。但是我没有在CParser中重载doNothing。那么我为什么要使用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 }}
};