Конечный автомат и паттерн Command...
От: Faust Россия  
Дата: 21.09.04 11:44
Оценка:
Возможна ли подобная конструкция, и если возможна, то где ошибка в моей реализации?

template <typename TExecuter>
class TCommand
{
public:
    typedef int (TExecuter::*Action)(void*);

    TCommand(TExecuter* pExecuter, Action pfnAction)
        : m_pExecuter(pExecuter)
        , m_pfnAction(pfnAction) { }

private:
    TExecuter*                m_pExecuter;
    Action                    m_pfnAction;

public:
    virtual int                Execute(void* pvParam)
    { return (m_pExecuter->*m_pfnAction)(pvParam); }
};

class CCommand
{
public:
    virtual int                Execute(void* pvParam) { return 0; }
};

class CReceiveFile : public CCommand
{
public:
    int                        Execute(void* pvParam)
    {
        char*    szParam = static_cast<char*> (pvParam);
        int        iLen = strlen(szParam);
        for(int i=0, j=iLen-1; i<iLen/2; i++, j--)
        {
            szParam[i] = szParam[i] ^ szParam[j];
            szParam[j] = szParam[j] ^ szParam[i];
            szParam[i] = szParam[i] ^ szParam[j];
        }
        return iLen;
    }

private:
    // На что повлияет введение этой переменной?
    HANDLE                    m_hFile;
};

class CProtocol
{
public:
    enum ECommads
    {
        Command = 1, 
        Server, 
        Client, 
        Request, 
        Answer, 
        File
    };

private:
    ECommads                m_eCommands;
    TCommand<CCommand>*        m_pCommand;

public:
    CProtocol() : m_eCommands(File), m_pCommand(NULL) { }
    ~CProtocol() {}

    int                        Process(void* pvBuffer)
    {
        switch(m_eCommands)
        {
        Server:
            break;
        Client:
            break;
        Request:
            break;
        Answer:
            break;
        File:
            // здесь траблы с типами, что я делаю не так?
            m_pCommand = reinterpret_cast<TCommand<CCommand>*>
                ((new CReceiveFile()), (&CReceiveFile::Execute));
            break;
        }
        // Безопасен ли этот вызов?
        return m_pCommand->Execute(pvBuffer);
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    char        szTest[] = "abcdefg";
    CProtocol*    pProtocol = new CProtocol();
    pProtocol->Process(szTest);
}
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.