Форум программистов, компьютерный форум CyberForum.ru

Передача указателя на функцию-член класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.94
ggmann
 Аватар для ggmann
20 / 20 / 1
Регистрация: 06.10.2008
Сообщений: 173
16.11.2010, 22:05     Передача указателя на функцию-член класса #1
Необходимо передать фунцию-член класса как аргумент в функцию другого класса.
Код:

Файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "head.hpp"
 
int Class1::foo (int x) { return x+2; }
void Class1::doIt() {
    int k = Class2::Do(foo);
}
 
static int Class2::Do(fu f) {
    return 2 * f(0);
}
 
int main() {
    return 0;
}
Файл head.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef HEAD_HPP_INCLUDED
#define HEAD_HPP_INCLUDED
 
class Class1 {
    int foo (int x);
    void doIt();
};
 
class Class2 {
    typedef int (*fu)(int);
    static int Do(fu);
};
 
#endif // HEAD_HPP_INCLUDED
Ошибка:
main.cpp|5|error: no matching function for call to 'Class2 :: Do(<unresolved overloaded function type>)

Добавлено через 7 часов 48 минут
ну неужели нет вариантов?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2010, 22:05     Передача указателя на функцию-член класса
Посмотрите здесь:

Передача указателя функции класса A в класс B C++
Передача указателя на метод в функцию C++
передача указателя на строку методу класса C++
C++ Передача указателя на функцию
Передача указателя в функцию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.11.2010, 22:10     Передача указателя на функцию-член класса #2
Указатели на функции в Си++.
ggmann
 Аватар для ggmann
20 / 20 / 1
Регистрация: 06.10.2008
Сообщений: 173
16.11.2010, 22:18  [ТС]     Передача указателя на функцию-член класса #3
а вот это уже интересно, почитаю) спс тебе.
но идеи всеравно выдвигайте, может что полезное подскажете по этому, типа как надо , как можна , а как нельзя делать...
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.11.2010, 22:21     Передача указателя на функцию-член класса #4
Идея — не передавать указатель на метод класса, потому что без экземпляра класса он всё равно работать не будет.
ctakah3112
0 / 0 / 0
Регистрация: 26.10.2014
Сообщений: 48
11.02.2016, 17:21     Передача указателя на функцию-член класса #5
Цитата Сообщение от volovzi Посмотреть сообщение
Всегда поражаюсь таким ответам, ты бы еще кинул ссылку на google.ru или википедию.
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
11.02.2016, 17:27     Передача указателя на функцию-член класса #6
а как насчет функторов? переопределить круглые скобки, будет объект, действующий как функция.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2134 / 967 / 223
Регистрация: 30.11.2013
Сообщений: 3,235
11.02.2016, 17:30     Передача указателя на функцию-член класса #7
ctakah3112, а надо перенабрать тот текст сюда, чтобы вы прочитали не переходя по ссылкам? Или разобрать статью и выписать только основное вам? Что вам не нравится?!
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
07.08.2016, 10:25     Передача указателя на функцию-член класса #8
Ну как тебе сказать??? Я вот зашёл в Вашу тему полгода спустя и ссылка уже не работает. Терпеть не могу, когда ответы делают ссылками на сторонние ресурсы. По ссылке я не поленюсь перейти, но, как правило, полгода-год спустя она уже не рабочая. И выходит, что ответ на вопрос в теме нашли, но воспользоваться им нельзя. Значит эта данная тема бесполезна на форуме. Только место занимает.
pav1uxa
1710 / 1550 / 599
Регистрация: 23.01.2014
Сообщений: 5,596
Завершенные тесты: 1
07.08.2016, 11:36     Передача указателя на функцию-член класса #9
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Всегда поражаюсь таким ответам
А я поражаюсь когда темы 6-годичной давности поднимают...
Цитата Сообщение от НеСказочник Посмотреть сообщение
Ну как тебе сказать??? Я вот зашёл в Вашу тему полгода спустя и ссылка уже не работает.
Зашел 6 лет спустя а не полгода. Уже несколько новых стандартов придумали. Может еще по ссылкам девяностых лазить и жаловаться что там контент устаревший?
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
07.08.2016, 11:41     Передача указателя на функцию-член класса #10
Цитата Сообщение от НеСказочник Посмотреть сообщение
По ссылке я не поленюсь перейти, но, как правило, полгода-год спустя она уже не рабочая.
Конкретно эта ссылка в целом рабочая, но домен rsdn.ru сейчас недоступен (это починят в ближайшее время).
Вот так будет сейчас работать: http://www.rsdn.org/article/cpp/fastdelegate.xml
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
07.08.2016, 11:51     Передача указателя на функцию-член класса #11
Спасибо. Но суть претензии не меняется: Ответы на форуме должны быть самодостаточными. Что бы тема не становилась бесполезной, в случае поломки ссылки. Всю статью, конечно, копировать не надо, но комментарием снабдить не помешает.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2134 / 967 / 223
Регистрация: 30.11.2013
Сообщений: 3,235
07.08.2016, 12:01     Передача указателя на функцию-член класса #12
НеСказочник, Л - лицемерство. Методы заполнения контейнера

Начните с себя, а потом используйте в своей речи фразы Ответы на форуме должны быть .... Хорошо?
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
07.08.2016, 12:43     Передача указателя на функцию-член класса #13
Согласен. Полное лицемерие, но вот только не с моей, а с Вашей стороны.

Вот моё сообщение, на которое Вы сослались:

Тут и тут подымается данный вопрос. Но, если вкратце, то, судя по всему, разница в том, что emplace_back вызывает конструктор копирования. Это означает, что добавление одного и того же экземпляра несколько раз при помощи emplace_back, на самом деле добавит несколько копий данного экземпляра.

Тут я даю ссылки:

Тут и тут подымается данный вопрос...
А тут я даю краткий комментарий, по сути проблемы:

... Но, если вкратце, то, судя по всему, разница в том, что emplace_back вызывает конструктор копирования. Это означает, что добавление одного и того же экземпляра несколько раз при помощи emplace_back, на самом деле добавит несколько копий данного экземпляра.

Я не перепечатывал всю статью, что бы не захламлять тему, но и ссылки дал не как есть, а снабдил комментариями, которых вполне достаточно, что бы понять суть решения даже, если ссылки перестали работать.
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
07.08.2016, 18:28     Передача указателя на функцию-член класса #14
Цитата Сообщение от НеСказочник Посмотреть сообщение
а снабдил комментариями, которых вполне достаточно, что бы понять
по ссылкам не ходил.
ваши комментарии - неверны.

emplace_back выполняет конструирование на месте.
он для того и был создан,
что бы зазря не дергать конструктор копии
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,702
Записей в блоге: 3
07.08.2016, 20:24     Передача указателя на функцию-член класса #15
Цитата Сообщение от ggmann Посмотреть сообщение
Необходимо передать фунцию-член класса как аргумент в функцию другого класса.
ggmann, а можно узнать условие задачи, которая решается таким способом. В самых общих чертах, хотя бы. Есть подозрение, что формулировка задачи ставит объекты, описываемые классами в неудобное положение. Это называется ошибкой архитектуры, обычно. Функции члены, это агенты поведения объектов и передавать их куда либо, это нарушение объектного подхода вообще и инкапсуляции, в частности. Если не идет речь о области видимости класса, конечно. То есть, если для статических данных и методов достаточно дружбы, то без объекта, функцию член передать можно разве что в виде функтора. В этом случае объект тоже передаётся, а вернее бы сказать, что именно объект и передаётся. Но указатель на функтор, - штучка непростая. Посмотрите тут:
http://www.cyberforum.ru/blogs/212894/blog4325.html
может понравится.
Но сначала определитесь. Есть подозрение, повторяю, что оно Вам не надо.
pav1uxa
1710 / 1550 / 599
Регистрация: 23.01.2014
Сообщений: 5,596
Завершенные тесты: 1
07.08.2016, 20:28     Передача указателя на функцию-член класса #16
Цитата Сообщение от IGPIGP Посмотреть сообщение
а можно узнать условие задачи

Не по теме:

А можно посмотреть все сообщения этой темы? А можно посмотреть дату создания темы?

IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,702
Записей в блоге: 3
07.08.2016, 20:38     Передача указателя на функцию-член класса #17
Цитата Сообщение от pav1uxa Посмотреть сообщение
А можно посмотреть все сообщения этой темы? А можно посмотреть дату создания темы?

pav1uxa,
Ну как чувствовал... И интуиция не подвела-таки:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Есть подозрение, повторяю, что оно Вам не надо.
оно уже и правда, не надо))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2016, 10:15     Передача указателя на функцию-член класса
Еще ссылки по теме:

Передача в функцию указателя C++
C++ Передача указателя в функцию
C++ Передача указателя в класс на объект другого класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Operok
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
08.08.2016, 10:15     Передача указателя на функцию-член класса #18
Цитата Сообщение от DrOffset Посмотреть сообщение
Конкретно эта ссылка в целом рабочая, но домен rsdn.ru сейчас недоступен (это починят в ближайшее время).
Вот так будет сейчас работать: http://www.rsdn.org/article/cpp/fastdelegate.xml
Самые быстрые делегаты, да, это так, идёт прямой вызов непосредственно переданной функции/метода. Полезно изучить как работают вызовы методов в разных компиляторах. Но данная статья скорее показывает несовместимость реализации "указателей" на методы класса (особенно с виртуальным наследованием) между разными компиляторами. Использовать FastDelegate можно на свой страх и риск, так как подобные манипуляции с указателями не стандартизированы (всё опирается на конкретную реализацию компилятора).
Если в программе узким местом является именно некий обратный вызов, то, удостоверившись в совместимости, можно использовать FastDelegate. По моему (скромному) мнению не стоит подобное использовать в написании библиотек и прочего повторно используемого кода.
И ещё к FastDelegate не прикрутишь использование lambda и других функторов.
Yandex
Объявления
08.08.2016, 10:15     Передача указателя на функцию-член класса
Ответ Создать тему
Опции темы

Текущее время: 05:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru