Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.94
ggmann
20 / 20 / 1
Регистрация: 06.10.2008
Сообщений: 173
#1

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

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

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

Файл 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2010, 22:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача указателя на функцию-член класса (C++):

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

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

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

Передача указателя функции класса A в класс B - C++
Добрый день! Стоит задача вызывать функцию другого класса в потоке, ну что то типа этого: typedef void (t1::*PTR_FUN)(int);...

Передача указателя в функцию - C++
Поиском не пользовался, возможно данный вопрос уже проскакивал. Проблема том, что VS2010 на отрез отказывается передавать указатель на...

Передача указателя на функцию - C++
Доброго дня Форумчане. Хотелось бы узнать как вызывать функцию получив на нее указатель? пример class C1 { public: void...

17
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.11.2010, 22:10 #2
Указатели на функции в Си++.
3
ggmann
20 / 20 / 1
Регистрация: 06.10.2008
Сообщений: 173
16.11.2010, 22:18  [ТС] #3
а вот это уже интересно, почитаю) спс тебе.
но идеи всеравно выдвигайте, может что полезное подскажете по этому, типа как надо , как можна , а как нельзя делать...
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.11.2010, 22:21 #4
Идея — не передавать указатель на метод класса, потому что без экземпляра класса он всё равно работать не будет.
0
ctakah3112
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 63
11.02.2016, 17:21 #5
Цитата Сообщение от volovzi Посмотреть сообщение
Всегда поражаюсь таким ответам, ты бы еще кинул ссылку на google.ru или википедию.
0
Babysitter
109 / 115 / 36
Регистрация: 23.11.2015
Сообщений: 346
Завершенные тесты: 1
11.02.2016, 17:27 #6
а как насчет функторов? переопределить круглые скобки, будет объект, действующий как функция.
0
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
11.02.2016, 17:30 #7
ctakah3112, а надо перенабрать тот текст сюда, чтобы вы прочитали не переходя по ссылкам? Или разобрать статью и выписать только основное вам? Что вам не нравится?!
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
07.08.2016, 10:25 #8
Ну как тебе сказать??? Я вот зашёл в Вашу тему полгода спустя и ссылка уже не работает. Терпеть не могу, когда ответы делают ссылками на сторонние ресурсы. По ссылке я не поленюсь перейти, но, как правило, полгода-год спустя она уже не рабочая. И выходит, что ответ на вопрос в теме нашли, но воспользоваться им нельзя. Значит эта данная тема бесполезна на форуме. Только место занимает.
0
pav1uxa
1846 / 1698 / 644
Регистрация: 23.01.2014
Сообщений: 6,078
Завершенные тесты: 1
07.08.2016, 11:36 #9
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Всегда поражаюсь таким ответам
А я поражаюсь когда темы 6-годичной давности поднимают...
Цитата Сообщение от НеСказочник Посмотреть сообщение
Ну как тебе сказать??? Я вот зашёл в Вашу тему полгода спустя и ссылка уже не работает.
Зашел 6 лет спустя а не полгода. Уже несколько новых стандартов придумали. Может еще по ссылкам девяностых лазить и жаловаться что там контент устаревший?
1
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
07.08.2016, 11:41 #10
Цитата Сообщение от НеСказочник Посмотреть сообщение
По ссылке я не поленюсь перейти, но, как правило, полгода-год спустя она уже не рабочая.
Конкретно эта ссылка в целом рабочая, но домен rsdn.ru сейчас недоступен (это починят в ближайшее время).
Вот так будет сейчас работать: http://www.rsdn.org/article/cpp/fastdelegate.xml
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
07.08.2016, 11:51 #11
Спасибо. Но суть претензии не меняется: Ответы на форуме должны быть самодостаточными. Что бы тема не становилась бесполезной, в случае поломки ссылки. Всю статью, конечно, копировать не надо, но комментарием снабдить не помешает.
0
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
07.08.2016, 12:01 #12
НеСказочник, Л - лицемерство. Методы заполнения контейнера

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

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

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

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

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

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

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

emplace_back выполняет конструирование на месте.
он для того и был создан,
что бы зазря не дергать конструктор копии
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,672
Записей в блоге: 5
07.08.2016, 20:24 #15
Цитата Сообщение от ggmann Посмотреть сообщение
Необходимо передать фунцию-член класса как аргумент в функцию другого класса.
ggmann, а можно узнать условие задачи, которая решается таким способом. В самых общих чертах, хотя бы. Есть подозрение, что формулировка задачи ставит объекты, описываемые классами в неудобное положение. Это называется ошибкой архитектуры, обычно. Функции члены, это агенты поведения объектов и передавать их куда либо, это нарушение объектного подхода вообще и инкапсуляции, в частности. Если не идет речь о области видимости класса, конечно. То есть, если для статических данных и методов достаточно дружбы, то без объекта, функцию член передать можно разве что в виде функтора. В этом случае объект тоже передаётся, а вернее бы сказать, что именно объект и передаётся. Но указатель на функтор, - штучка непростая. Посмотрите тут:
http://www.cyberforum.ru/blogs/212894/blog4325.html
может понравится.
Но сначала определитесь. Есть подозрение, повторяю, что оно Вам не надо.
0
07.08.2016, 20:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2016, 20:24
Привет! Вот еще темы с ответами:

передача указателя на функцию - C++
Помогите исправить ошибку уже незнаю как быть В бивает ту ошибку error C2664: Generate: невозможно преобразовать параметр 2 из &quot;void&quot;...

Передача указателя в функцию - C++
Здравствуйте. Прошу помощи, сижу уже пару часов читаю мануалы, но так и не смог до конца понять, что мне делать. Есть вот такой код: ...

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

Передача в функцию указателя - C++
Почему плохо передавать в функцию указатель на строку или массив и возвращать указатель на строку или массив?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru