Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Очередь выполнения функций в пределах класса


Автор: ecspertiza 10.10.2010, 23:17
Всем доброй ночи, сейчас попробую объяснить чего хочу добиться. Есть класс в котором функции выполняются асинхронно,  в связи с этим хочу организовать очередь выполнения ф-ций, накидал такой пример

Код

class Core
{
    public:
        Core();
    private:
        void test_1();
        void test_2();
        std::vector<void (Core::*)()> queue;
        void addQueue(void (Core::*)());

        void check_queue();
};

Core::Core(){
    addQueue(test_1);
    addQueue(test_2);
}

void Core::test_1()
{
    std::cout << "Core::test_1" << std::endl;
}

void Core::test_2()
{
    std::cout << "Core::test_2" << std::endl;
}

void Core::check_queue()
{
    if (queue.size() > 0)
    {
        queue.at(0)();
        queue.erase(queue.begin());
        check_queqe();
    }
}

void Core::addQueue(void (Core::*v)())
{
    queue.insert(queue.end(),v);
}

int main(int argc, char *argv[])
{
    Core *c = new Core();
}


компилятор выдает три ошибки с которыми я уже и не знаю как бороться.

Код

main.cpp:23:20: error: no matching function for call to 'Core::addQueue(<unresolved overloaded function type>)' 
main.cpp:17:14: note: candidate is: void Core::addQueue(void (Core::*)()) 
main.cpp:24:20: error: no matching function for call to 'Core::addQueue(<unresolved overloaded function type>)' 
main.cpp:17:14: note: candidate is: void Core::addQueue(void (Core::*)()) 
main.cpp: In member function 'void Core::check_queue()': 
main.cpp:41:21: error: must use '.*' or '->*' to call pointer-to-member function in '((Core*)this)->Core::queue.std::vector<_Tp, _Alloc>::at [with _Tp = void
 (Core::*)(), _Alloc = std::allocator<void (Core::*)()>, std::vector<_Tp, _Alloc>::reference = void (Core::*&)(), std::vector::size_type = unsigned int](0u) (...)',
 e.g. '(... ->* ((Core*)this)->Core::queue.std::vector<_Tp, _Alloc>::at [with _Tp = void (Core::*)(), _Alloc = std::allocator<void (Core::*)()>, std::vector<_Tp,
 _Alloc>::reference = void (Core::*&)(), std::vector::size_type = unsigned int](0u)) (...)' 
main.cpp: In function 'int main(int, char**)': 


что самое интересное если это реализовывать вне класса то все отрабатывает хорошо, подскажите как с этим бороться.

Автор: bsa 10.10.2010, 23:54
addQueue(&Core::test_1);

Автор: mes 10.10.2010, 23:55
Цитата(ecspertiza @  10.10.2010,  22:17 Найти цитируемый пост)
  addQueue(test_1);

Код

 addQueue(&Core::test_1):

Цитата(ecspertiza @  10.10.2010,  22:17 Найти цитируемый пост)
queue.at(0)();

Код

(this->*queue.at(0))();

Автор: ecspertiza 11.10.2010, 09:30
bsa, mes, спасибо за помощь все заработало, не могли бы вы только объяснить эту конструкцию
Код

(this->*queue.at(0))();


как то не совсем ясно smile

Автор: djamshud 11.10.2010, 10:42
ecspertiza, так делается вызов метода по указателю. Таков синтаксис, с этим нужно смириться.

Код

(object.*method)();
(ptr->*method)();

Автор: ecspertiza 11.10.2010, 10:56
djamshud, понял, спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)