Очередь операций - PullRequest
       36

Очередь операций

0 голосов
/ 17 декабря 2010

Я создаю класс для обработки файла конфигурации.Я хочу, чтобы он работал:

Есть очередь, в которой сохраняются все операции (вставка данных, стирание данных ...), затем метод Commit применит все эти изменения.

Мои прототипы выглядят так (все настройки файла хранятся в карте STL):

bool Insert(std::string const& key, std::string const& value);
bool Erase(std::string const& key);

Итак, я попытался создать очередь STL с указателем на функции, но функции не имеют одинакового количества аргументов, и я не знаю, что делать ...

1 Ответ

2 голосов
/ 17 декабря 2010

Вы можете создать базовый класс Operation, а затем получить его дважды для создания классов Insert и Erase.Затем вы можете сохранить указатели на класс Operation.

class Settings
{
public:
    bool Insert(std::string const& key, std::string const& value)
    {
        m_operations.push_back(new Insert(key, value));
        return true; //?      
    }

    bool Erase(std::string const& key)
    {
        m_operations.push_back(new Erase(key));
        return true; //?
    }

    bool Commit()
    {
        // You know what to do by now right ?
    }

private:
    class Operation
    {
    public:
        virtual void Execute() = 0
    }

    class Insert : public Operation
    {
    public:
        Insert(std::string const& key, std::string const& value) : 
            m_key(key), m_value(value) {}

        void Execute() {...}
    private:
        std::string m_key;
        std::string m_value;
    }

    class Erase : public Operation
    {
    public:
        Erase(std::string const& key) : m_key(key) {}

        void Execute() {...}
    private:
        std::string m_key;
    }

    std::queue<Operation*> m_operations;
    std::map<std::string, std::string> m_settings;
}

Затем вы либо сделаете свои классы операций друзьями класса настроек, либо передадите ссылку на карту, к которой должна применяться операция.

...