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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как задать членом класса указатель на функцию? 
:(
    Опции темы
Нитонисе
Дата 4.1.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пишу класс
Код

class TMyClass
{
  public:
    void SetFunc(void *f) {func = f;}
    void DoFunc() {f()};
  private:
    void *func;
};

Этот код конечно не работает, просто что бы пояснить чего я хочу. А хочу я иметь членом класса некую функцию func, реализация которой может быть произвольной. Ну вот например:
Код

function1() 
{
  ShowMessage("function1");
}
function2() 
{
  ShowMessage("function2");
}


TMyClass *mc = new TMyClass;
mc->SetFunc(function1);
mc->DoFunc(); // выводит сообшение "function1"
mc->SetFunc(function2);
mc->DoFunc(); // выводит сообшение "function2"


Как это сделать?
PM MAIL   Вверх
EvilsInterrupt
Дата 4.1.2013, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Нитонисе
1)
Код

    void DoFunc() {f()};

Это верно? Если оформить по красивее, то:
Код

    void DoFunc()
    {
        f()
    };


2)
Почему в setFunc присваиваете в переменную "void *func;", а в DoFunc() дергаете какую-то мифическую f() ?

3)
Может Вам изучить понятие "функтор" ? Другие названия этого термина "Объект функции". Это класс с переопределенным оператором "круглые скобки", чтобы объект этого класса вел себя как функция. Т.е. "все что выглядит как функция, ведет себя как функция = есть функция"
PM MAIL WWW ICQ Jabber   Вверх
Нитонисе
Дата 4.1.2013, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



С оформлением я не заморачивался, потому как писал прямо в форме ответа. Соответственно и опечатку в DoFunc допустил. А вот по п.3 видно надо изучать матчасть.
PM MAIL   Вверх
NoviceF
Дата 4.1.2013, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

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



Цитата(Нитонисе @  4.1.2013,  14:37 Найти цитируемый пост)
Как это сделать? 

что-то похожее на то, что ты хочешь, есть в паттерне "Стратегия" http://ru.wikipedia.org/wiki/%D0%A1%D1%82%...BD%D0%B8%D1%8F)

вот кусок кода оттуда
Код

int _tmain(int argc, _TCHAR* argv[])
{
        Client customClient;
        Strategy_1 str1;
        Strategy_2 str2;
        Strategy_3 str3;
 
        customClient.SetStrategy(&str1);
        customClient.UseStrategy();
        customClient.SetStrategy(&str2);
        customClient.UseStrategy();
        customClient.SetStrategy(&str3);
        customClient.UseStrategy();
 
        return 0;
}

Цитата(Нитонисе @  4.1.2013,  14:37 Найти цитируемый пост)
 А хочу я иметь членом класса некую функцию func, реализация которой может быть произвольной. 

в моём понимании произвольной может быть реализации, но интерфейс должен быть фиксированным. В случае с функцией, фиксированной должна быть сигнатура.
Ну то есть здесь
Код

class TMyClass
{
  public:
    void SetFunc(void *f) {func = f;}
    void DoFunc() {f()};
  private:
    void *func;
};

 void *func; должен быть указателем на какую-то конкретную сигнатуру, и присваивать ему мы дожны функции с такой же сигнатурой, но, если требуется, различным поведением. Хотя на практике не сталкивался, но по идее должно работать smile

Это сообщение отредактировал(а) NoviceF - 4.1.2013, 16:09
PM MAIL   Вверх
mes
Дата 4.1.2013, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(NoviceF @  4.1.2013,  15:03 Найти цитируемый пост)
 В случае с функцией, фиксированной должна быть сигнатура.

понятие функция может быть легко расширено до функционального обьекта и это расскрывает новые свободы, о чeм уже было сказано выше..
для ознакомления с подобной концепцией см.   [boost:: / (c++11)std::] function и bind..

Добавлено через 2 минуты и 16 секунд
Цитата(Нитонисе @  4.1.2013,  12:37 Найти цитируемый пост)
 А хочу я иметь членом класса некую функцию func, реализация которой может быть произвольной. 

для простой функции никаких наворотов не требуется, всe работает из коробки )


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


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Нитонисе
Поясни какую проблему ты решаешь? Для чего потребовался такой код? Возможно есть решение проще.
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 4.1.2013, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Нитонисе @  4.1.2013,  12:37 Найти цитируемый пост)
private:
    void *func;

вот набросок :
Код

#include <iostream>

struct A { 
   
   void (*some_fn)();
   
   void do_some () {
      some_fn();
   }
}; 
void f1 () { std::cout << 1; }
void f2 () { std::cout << 2; }

int main ()
{
   A a;
   a.some_fn = f1;   
   a.do_some();
   
   a.some_fn = f2;   
   a.do_some();   
}



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

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



 smile для понимания, пожалуйста, сделайте набросок, чего в данном примере можно добиться используя функтор, вместо указателя на функцию и почему требования к сигнатуре можно игнорировать.
PM MAIL   Вверх
EvilsInterrupt
Дата 4.1.2013, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



NoviceF
По моему никнейму поищи недавнюю тему, которую я создал. В ней  про функторы достаточно много рассказано
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 4.1.2013, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(NoviceF @  4.1.2013,  19:26 Найти цитируемый пост)
используя функтор, 

глянуть хотя бы на стл :
Код

 using namespace std::placeholders; 
 auto found = std::find_if(v.begin(), v.end(), 
    std::bind(std::logical_and<bool>()
              , std::bind(std::less<int>(),10, _1)
              , std::bind(std::greater<int>(),15, _1)
            ) );

http://liveworkspace.org/code/409lqK$0

Добавлено через 3 минуты и 54 секунды
если вместо 10 и 15 поставить переменные, то реализовать подобное через указатели на функции будет затруднительно..

Добавлено через 6 минут и 52 секунды
ну а с лямбдой, как дальнейшее развитии функтора, выглядит еще удобнее :
http://liveworkspace.org/code/409lqK$2

Добавлено через 9 минут и 31 секунду
 ну и с замыканием контекста : http://liveworkspace.org/code/409lqK$3

все это приведенно на скорую руку, на самом деле преимущества гораздо шире )


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


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



mes
Я бы предпочел так оформить код:
Код

auto found = std::find_if(v.begin(), v.end(),
    [=](int i) 
    {
       return (i>min && i<max); 
    }
);


Понятней как-то... )
PM MAIL WWW ICQ Jabber   Вверх
NoviceF
Дата 4.1.2013, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

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



Спасибо за примеры, но представление о функторах и лямбдах я имею smile вопрос был больше из области по данному классу.. Вывод, как я понимаю, в том, что в фиксированную сигнатуру, благодаря функторам/лямбдам, можно запихать много чего?

Это сообщение отредактировал(а) NoviceF - 4.1.2013, 23:47
PM MAIL   Вверх
EvilsInterrupt
Дата 4.1.2013, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



NoviceF
Польза от использования функторов в том что это объекты! А объекты имеют состояние. То есть перед подачей объекта куда-либо ты можешь его про инициализировать, а после того как это "куда-либо" отработало ты еще можешь прочитав его состояние знать результат какой-угодно тебе.

Рекомендую книгу Джосьютиса "Стандартная библиотека C++". Сам читаю, очень опечален тем что раньше ее не прочитал (((
PM MAIL WWW ICQ Jabber   Вверх
NoviceF
Дата 5.1.2013, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

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



Цитата(EvilsInterrupt @  5.1.2013,  00:51 Найти цитируемый пост)
Польза от использования функторов в том что это объекты! А объекты имеют состояние. То есть перед подачей объекта куда-либо ты можешь его про инициализировать, а после того как это "куда-либо" отработало ты еще можешь прочитав его состояние знать результат какой-угодно тебе.

спасибо, учту.
Цитата(EvilsInterrupt @  5.1.2013,  00:51 Найти цитируемый пост)
Рекомендую книгу Джосьютиса "Стандартная библиотека C++". Сам читаю, очень опечален тем что раньше ее не прочитал ((( 

хороших книжек много и читаю я их не быстро smile но тоже возьму на вооружение.
PM MAIL   Вверх
mes
Дата 5.1.2013, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(EvilsInterrupt @  4.1.2013,  22:22 Найти цитируемый пост)
Я бы предпочел так оформить код:

Цитата(mes @  4.1.2013,  22:05 Найти цитируемый пост)
все это приведенно на скорую руку,

 smile 

Цитата(NoviceF @  4.1.2013,  22:47 Найти цитируемый пост)
из области по данному классу

по данному классу сказать проблематично, так как требования по задаче не сформурлированы, а я увы не телепат smile 

Цитата(NoviceF @  4.1.2013,  22:47 Найти цитируемый пост)
 как я понимаю, в том, что в фиксированную сигнатуру, благодаря функторам/лямбдам, можно запихать много чего?

грубо говоря, да  smile 

Цитата(EvilsInterrupt @  4.1.2013,  22:51 Найти цитируемый пост)
 А объекты имеют состояние

 smile 

Это сообщение отредактировал(а) mes - 5.1.2013, 04:07


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1103 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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