C ++无法从类定义

时间:2016-11-07 08:20:34

标签: c++ access protected derived-class base-class

我读了一篇学士论文,用不同的方法用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 }}
};

0 个答案:

没有答案