Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/43: Рейтинг темы: голосов - 43, средняя оценка - 4.77
21 / 21 / 7
Регистрация: 06.10.2008
Сообщений: 173
1

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

16.11.2010, 22:05. Показов 7918. Ответов 17
Метки нет (Все метки)

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

Файл 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 минут
ну неужели нет вариантов?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2010, 22:05
Ответы с готовыми решениями:

Хранение в map указателя на функцию-член шаблонного класса
Здравствуйте! Сделал я себе вызов написать джунгли из ООП деревьев, типо, объекты обмениваются...

Указатель на объект из указателя на член класса
Что как-то сей вопрос ставит меня в тупик. class A { int i; } obj; int main()

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

Передача указателя на шаблонную функцию в другую функцию
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает...

17
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
16.11.2010, 22:10 2
Указатели на функции в Си++.
3
21 / 21 / 7
Регистрация: 06.10.2008
Сообщений: 173
16.11.2010, 22:18  [ТС] 3
а вот это уже интересно, почитаю) спс тебе.
но идеи всеравно выдвигайте, может что полезное подскажете по этому, типа как надо , как можна , а как нельзя делать...
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
16.11.2010, 22:21 4
Идея — не передавать указатель на метод класса, потому что без экземпляра класса он всё равно работать не будет.
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
11.02.2016, 17:21 5
Цитата Сообщение от volovzi Посмотреть сообщение
Всегда поражаюсь таким ответам, ты бы еще кинул ссылку на google.ru или википедию.
0
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
11.02.2016, 17:27 6
а как насчет функторов? переопределить круглые скобки, будет объект, действующий как функция.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.02.2016, 17:30 7
ctakah3112, а надо перенабрать тот текст сюда, чтобы вы прочитали не переходя по ссылкам? Или разобрать статью и выписать только основное вам? Что вам не нравится?!
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
07.08.2016, 10:25 8
Ну как тебе сказать??? Я вот зашёл в Вашу тему полгода спустя и ссылка уже не работает. Терпеть не могу, когда ответы делают ссылками на сторонние ресурсы. По ссылке я не поленюсь перейти, но, как правило, полгода-год спустя она уже не рабочая. И выходит, что ответ на вопрос в теме нашли, но воспользоваться им нельзя. Значит эта данная тема бесполезна на форуме. Только место занимает.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
07.08.2016, 11:36 9
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Всегда поражаюсь таким ответам
А я поражаюсь когда темы 6-годичной давности поднимают...
Цитата Сообщение от НеСказочник Посмотреть сообщение
Ну как тебе сказать??? Я вот зашёл в Вашу тему полгода спустя и ссылка уже не работает.
Зашел 6 лет спустя а не полгода. Уже несколько новых стандартов придумали. Может еще по ссылкам девяностых лазить и жаловаться что там контент устаревший?
1
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
07.08.2016, 11:41 10
Цитата Сообщение от НеСказочник Посмотреть сообщение
По ссылке я не поленюсь перейти, но, как правило, полгода-год спустя она уже не рабочая.
Конкретно эта ссылка в целом рабочая, но домен rsdn.ru сейчас недоступен (это починят в ближайшее время).
Вот так будет сейчас работать: http://www.rsdn.org/article/cpp/fastdelegate.xml
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
07.08.2016, 11:51 11
Спасибо. Но суть претензии не меняется: Ответы на форуме должны быть самодостаточными. Что бы тема не становилась бесполезной, в случае поломки ссылки. Всю статью, конечно, копировать не надо, но комментарием снабдить не помешает.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
07.08.2016, 12:01 12
НеСказочник, Л - лицемерство. Методы заполнения контейнера

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

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

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

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

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

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

Я не перепечатывал всю статью, что бы не захламлять тему, но и ссылки дал не как есть, а снабдил комментариями, которых вполне достаточно, что бы понять суть решения даже, если ссылки перестали работать.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.08.2016, 18:28 14
Цитата Сообщение от НеСказочник Посмотреть сообщение
а снабдил комментариями, которых вполне достаточно, что бы понять
по ссылкам не ходил.
ваши комментарии - неверны.

emplace_back выполняет конструирование на месте.
он для того и был создан,
что бы зазря не дергать конструктор копии
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
07.08.2016, 20:24 15
Цитата Сообщение от ggmann Посмотреть сообщение
Необходимо передать фунцию-член класса как аргумент в функцию другого класса.
ggmann, а можно узнать условие задачи, которая решается таким способом. В самых общих чертах, хотя бы. Есть подозрение, что формулировка задачи ставит объекты, описываемые классами в неудобное положение. Это называется ошибкой архитектуры, обычно. Функции члены, это агенты поведения объектов и передавать их куда либо, это нарушение объектного подхода вообще и инкапсуляции, в частности. Если не идет речь о области видимости класса, конечно. То есть, если для статических данных и методов достаточно дружбы, то без объекта, функцию член передать можно разве что в виде функтора. В этом случае объект тоже передаётся, а вернее бы сказать, что именно объект и передаётся. Но указатель на функтор, - штучка непростая. Посмотрите тут:
https://www.cyberforum.ru/blog... g4325.html
может понравится.
Но сначала определитесь. Есть подозрение, повторяю, что оно Вам не надо.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
07.08.2016, 20:28 16
Цитата Сообщение от IGPIGP Посмотреть сообщение
а можно узнать условие задачи

Не по теме:

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

0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
07.08.2016, 20:38 17
Цитата Сообщение от pav1uxa Посмотреть сообщение
А можно посмотреть все сообщения этой темы? А можно посмотреть дату создания темы?

pav1uxa,
Ну как чувствовал... И интуиция не подвела-таки:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Есть подозрение, повторяю, что оно Вам не надо.
оно уже и правда, не надо))
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
08.08.2016, 10:15 18
Цитата Сообщение от DrOffset Посмотреть сообщение
Конкретно эта ссылка в целом рабочая, но домен rsdn.ru сейчас недоступен (это починят в ближайшее время).
Вот так будет сейчас работать: http://www.rsdn.org/article/cpp/fastdelegate.xml
Самые быстрые делегаты, да, это так, идёт прямой вызов непосредственно переданной функции/метода. Полезно изучить как работают вызовы методов в разных компиляторах. Но данная статья скорее показывает несовместимость реализации "указателей" на методы класса (особенно с виртуальным наследованием) между разными компиляторами. Использовать FastDelegate можно на свой страх и риск, так как подобные манипуляции с указателями не стандартизированы (всё опирается на конкретную реализацию компилятора).
Если в программе узким местом является именно некий обратный вызов, то, удостоверившись в совместимости, можно использовать FastDelegate. По моему (скромному) мнению не стоит подобное использовать в написании библиотек и прочего повторно используемого кода.
И ещё к FastDelegate не прикрутишь использование lambda и других функторов.
0
08.08.2016, 10:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2016, 10:15
Помогаю со студенческими работами здесь

Передача указателя на строку методу класса
после того как я изменил содержание указателя name на Nika Gamkrelidze, name в объекте не...

Передача члену класса указателя на родителя
В общем имеется два класса Application и Window. Указатель на Window является членом класса...

Передача указателя функции класса A в класс B
Добрый день! Стоит задача вызывать функцию другого класса в потоке, ну что то типа этого: ...

Передача указателя в функцию
Здраствуйте. Если не охота читать гору текста то этот абзац + последущий за ним код можете...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru