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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на функцию класса 
:(
    Опции темы
Salatovec
Дата 24.2.2010, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте, столкнулся с такой проблемой, имеется код:
Код

class A
{
   double function(double a, double b) 
   {
      return a+b;
   }
};

class B
{
   double call(double(A::*f)(double, double))
   {
      return f(1.0, 2.0);
   }
};

соответственно пытаюсь написать указатель на функцию класса А, а компилятор мне выдаёт "Call of nonfunction". 
Что я делаю не так? Заранее спасибо!
PM MAIL   Вверх
mes
Дата 24.2.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Salatovec @  24.2.2010,  21:26 Найти цитируемый пост)
Что я делаю не так? 

ну Вы ж сами написали что 

Цитата(Salatovec @  24.2.2010,  21:26 Найти цитируемый пост)
указатель на функцию класса А

а функции члены вызываются только применительно к объекту

Вобщем выглядеть может так :
Код

double call(А& а, double(A::*f)(double, double))
{
       (a.*f) (1.0, 2.0);
}



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


Бывалый
*


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

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



mes, спасибо это осознал =)
а как теперь функцию function класа А передать функцие call класса B?

Нечто вроде:
Код

void main()
{
   A a;
   B b;
   b.call(a.function));
}

PM MAIL   Вверх
andrew_121
Дата 24.2.2010, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Код

void main() {
   A a;
   B b;
   b.call(boost::bind(&A::function, &a));
}


или так:
Код

void main() {
   A a;
   B b;
   b.call( [&](double a, double b) { a.function(a, b); } );
}

 smile 

хотя, по моему, я смысла не понял...

Добавлено через 6 минут и 10 секунд
Цитата(mes @  24.2.2010,  22:33 Найти цитируемый пост)
double(A::*f)(double, double)

ух ты smile 
да это прошлый век.

нынче делается при помощи:
Код

boost::function<>
std::function<>



Это сообщение отредактировал(а) andrew_121 - 24.2.2010, 23:08


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bilbobagginz
Дата 24.2.2010, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



насколько я помню доступ по умолчанию - private
ты хочешь "экспортнуть" приватный метод в чужой класс...
по-моему это не должно работать, т.к. адрес функции должен быть как-то защищен.
а с публичным методом - должно. возможно тебе не хватает ключевого слова public: ?


а если private не защищен, то на кой этот долбанный c++ нужен ?! smile



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Salatovec
Дата 24.2.2010, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Функции естественно в паблик области, просто совершенно забыл это написать =(

Добавлено через 1 минуту и 25 секунд
Цитата

да это прошлый век.

нынче делается при помощи:


Насколько я помню, в билдере нету библиотеки буст? Ибо пишу сейчас именно в нём.
PM MAIL   Вверх
andrew_121
Дата 24.2.2010, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(bilbobagginz @  24.2.2010,  23:19 Найти цитируемый пост)
насколько я помню доступ по умолчанию - private

епс! вот я ступил... smile

Добавлено через 47 секунд
Цитата(bilbobagginz @  24.2.2010,  23:19 Найти цитируемый пост)
на кой этот долбанный c++ нужен ?!

отставить холивар!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 25.2.2010, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Salatovec @  24.2.2010,  21:43 Найти цитируемый пост)
а как теперь функцию function класа А передать функцие call класса B?

можно вначале классу B передать указатель (например через конструктор и запомнить), а потом  вызывать call с нужной функцией
или наоборот запомнить функцию, а передавать в call нужный указатель, в зависимости от того что требуется
можно скомбинировать оба подохда, т.е запоминать и то и другое и вызывать когда требуется (отложенный вызов) - для этого лучше bind/function
ну или простой вариант передавать  и то и другое и сразу производить вызов - такой подход в предложенном мной варианте  (хотя смысла в нем много не вижу, но для разбора пойдет) :
Код

..
double call(А& а, double(A::*f)(double, double));
..
A a;
..call (a, &a::function);


Добавлено @ 00:33
Цитата(Salatovec @  24.2.2010,  22:25 Найти цитируемый пост)
Насколько я помню, в билдере нету библиотеки буст? 

ну и без буста есть библиотеки такое реализующее smile  главное поискать .. smile
из "маленьких"  например : Winnie Closure,  также упрощенный bind (аналог boost:bind) и не только они.
smile

Добавлено через 8 минут и 29 секунд
кстати может Вам совсем и не это надо.. Если осветите для чего все это делается, думаю кто нибудь из форумчан подскажет правильный путь 
smile

Это сообщение отредактировал(а) mes - 25.2.2010, 00:34


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


Бывалый
*


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

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



Цитата

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


Нужно мне это по учебё, где дали задание "Реализовать два класса, один из которых содержит некую член-функцию, а второй содержит член-функцию, в которой используется функция первого класса. Передачу функции реализовать посредством указателя на функцию класса."
PM MAIL   Вверх
mes
Дата 25.2.2010, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Salatovec @  24.2.2010,  23:46 Найти цитируемый пост)
Нужно мне это по учебё, где дали задание

ну раз по учебе, значит так как сказали smile
ну чтоб интересней было выполнять , можно например реализовать вызов функции по строковому имени,
вот пример для допиливания http://codepad.org/7qHfLS7O



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


трололомен
****


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

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



Цитата(Salatovec @  24.2.2010,  23:25 Найти цитируемый пост)
Насколько я помню, в билдере нету библиотеки буст? Ибо пишу сейчас именно в нём. 

Какая версия камрад? 2009/2010 пользуется этими плодами цивилизации. как бе.
PM MAIL   Вверх
Salatovec
Дата 25.2.2010, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



mes, Спасибо огромное! =)
mrbrooks, 2007, всё никак не соберусь реинсталить на 2009 =(
PM MAIL   Вверх
bilbobagginz
Дата 25.2.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



Цитата(andrew_121 @  24.2.2010,  22:27 Найти цитируемый пост)
отставить холивар! 

секунда: т.е. если добавляешь public: - то до функции достукиваешься ? значит си++ "свою работу делает"
понятненько.



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0926 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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