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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача указателя на функцию-член 
:(
    Опции темы
Inversus
  Дата 28.8.2016, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет !

Необходимо передать функцию-член в качестве параметра другой функции-члену. Следующий код

Код

class Menu {
    public:
    void spin();   
};

void Menu::spin() {
  ;
}

class Encoder {
  public:
    void setSpinFunc(void(Menu::*i)());
};

void Encoder::setSpinFunc(void(Menu::*i)()) {
  ;
}

int main()
{
    Menu m();
    Encoder e();
    e.setSpinFunc(m.spin);
}


вызывает ошибку: request for member 'setSpinFunc' in 'e', which is of non-class type 'Encoder()'

Уже долго туплю над этим, похоже сам не въеду, разъясните что не так.
PM MAIL   Вверх
baldman88
Дата 29.8.2016, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 3
Всего: 7



Все просто. Не нужно ставить скобки после m и e в main. Ну и вот это:
Код
void setSpinFunc(void(Menu::*i)());
ерунда какая-то. Так у Вас тоже ничего не выйдет.
PM MAIL   Вверх
xvr
Дата 29.8.2016, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Код

    Menu m;
    Encoder e;
    e.setSpinFunc(&Menu::spin);


PM MAIL   Вверх
azesmcar
Дата 29.8.2016, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



а лучше так
Код

#include <iostream>
#include <functional>

class Menu {
    public:
    void spin();   
};

void Menu::spin() {
    std::cout << "callback" << std::endl;
}

class Encoder {
public:
    void setSpinFunc(std::function<void()> callback);
};

void Encoder::setSpinFunc(std::function<void()> callback) {
    callback();
}

int main()
{
    Menu m;
    Encoder e;
    e.setSpinFunc(std::bind(&Menu::spin, &m));
}

PM   Вверх
azesmcar
Дата 29.8.2016, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(Inversus @  28.8.2016,  23:47 Найти цитируемый пост)
    Menu m();
    Encoder e();

в C++ все, что может быть рассмотрено как объявление функции является объявлением функции. Тяжелое наследие Си.
Вызов конструктора будет в данном случае рассмотрен как объявление прототипа функции, потому скобки ставить не надо.
PM   Вверх
Inversus
Дата 29.8.2016, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(azesmcar @  29.8.2016,  16:07 Найти цитируемый пост)
в C++ все, что может быть рассмотрено как объявление функции является объявлением функции. Тяжелое наследие Си.
 А, понятно.

Цитата(azesmcar @  29.8.2016,  15:39 Найти цитируемый пост)
std::function<void()> callback
 - некогда не пользовался такой конструкцией, это получается универсальный указатель ? 
Цитата(azesmcar @  29.8.2016,  15:39 Найти цитируемый пост)
std::bind(&Menu::spin, &m)
 - тоже интересно, придется вникать )

xvr, azesmcar,  Спасибо. Жаль, не могу плюсики поставить  smile 

P.S. На другом форуме тот же вопрос задавал - начался срач не с чего smile Что для счастья программиста надо  smile
Ууу, там уже базар про то как наши космические корабли бороздят просторы большого театра  smile 


Это сообщение отредактировал(а) Inversus - 29.8.2016, 22:32
PM MAIL   Вверх
azesmcar
Дата 29.8.2016, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(Inversus @  29.8.2016,  22:25 Найти цитируемый пост)
 - некогда не пользовался такой конструкцией, это получается универсальный указатель ? 

современный указатель на функцию. прелести нового стандарта. и std::bind тоже (современная замена std::mem_fun, std::bind1st, std::bind2nd и ему подобных).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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