Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очередь выполнения функций в пределах класса 
:(
    Опции темы
ecspertiza
Дата 10.10.2010, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 1
Всего: 5



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

Код

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**)': 


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

Это сообщение отредактировал(а) ecspertiza - 10.10.2010, 23:19


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
bsa
Дата 10.10.2010, 23:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



addQueue(&Core::test_1);
PM   Вверх
mes
Дата 10.10.2010, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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))();



--------------------
PM MAIL WWW   Вверх
ecspertiza
Дата 11.10.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 1
Всего: 5



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

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


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


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
djamshud
Дата 11.10.2010, 10:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



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

Код

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



--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
ecspertiza
Дата 11.10.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 1
Всего: 5



djamshud, понял, спасибо smile


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.