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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача функции или метода в кач-ве параметра 
:(
    Опции темы
nerezus
Дата 30.4.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Есть некоторый класс. В одном из его методов он должен принимать функцию, в другом вызывать ее.
1) Функция. Она всегда имеет параметры определенного типа. Допустим структуру st.
Один из методов моего класса получает эту функцию(как?) и запоминает в свойство(с каким типом?), а другой метод вызывает ее(как?) с параметром в виде структуры.

2) То же самое, но с методом объекта, а не с функцией. Класс объекта заранее не известен.

Это сообщение отредактировал(а) nerezus - 30.4.2007, 18:52


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
vinter
Дата 30.4.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

Репутация: 13
Всего: 56



Цитата(nerezus @  30.4.2007,  18:51 Найти цитируемый пост)
1) Функция. Она всегда имеет параметры определенного типа. Допустим структуру st.Один из методов моего класса получает эту функцию(как?) и запоминает в свойство(с каким типом?), а другой метод вызывает ее(как?) с параметром в виде структуры.

Код

typedef int (*pFunction)(int);
int SomeFunc(int nVar)
{
     return nVar;
}
void function(pFunction pF);
........................
function(SomeFunc);

тебе это надо??


--------------------
Мой блог
PM MAIL WWW   Вверх
archimed7592
Дата 30.4.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



для метода:
Код
struct A
{
    void Fun (int, int) {}
};
typedef void (A::* pFun)(int, int);
pFun f = &A::Fun;
A a;
a.*f (1, 2);

совет тебе добрый: многим лучше использовать обощённые функторы...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Greeen
Дата 30.4.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 18



Код

#include "stdafx.h"

struct MyStruct
{
    int number;
    char ch;

    MyStruct(int Number, char Char) : number(Number), ch(Char) {}
};

typedef void(*MyFunc)(const MyStruct& Structure);

class MyClass
{
private:
    MyFunc m_func;

public:
    MyClass() {}
    void SetFunc(MyFunc Function) { m_func = Function; }
    void CallFunc(MyStruct Structure) { m_func(Structure); }
};

void TestFunction1(const MyStruct& Structure)
{
    std::cout << Structure.number << ' ' << Structure.ch;
}

void TestFunction2(const MyStruct& Structure)
{
    std::cout << Structure.ch << ' ' << Structure.number;
}

int _tmain(int argc, _TCHAR* argv[])
{
    MyStruct my_struct(10, 'A');
    MyClass my_class;
    my_class.SetFunc(TestFunction1);
    my_class.CallFunc(my_struct);
    my_class.SetFunc(TestFunction2);
    my_class.CallFunc(my_struct);
    return 0;
}



--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Mayk
Дата 30.4.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(archimed7592 @  30.4.2007,  23:13 Найти цитируемый пост)

совет тебе добрый: многим лучше использовать обощённые функторы... 

А учитывая
Цитата(nerezus @  30.4.2007,  22:51 Найти цитируемый пост)

2) То же самое, но с методом объекта, а не с функцией. Класс объекта заранее не известен.

то другого приемлимого выхода собственно и не остаётся.

Это сообщение отредактировал(а) Mayk - 30.4.2007, 19:18


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
nerezus
Дата 30.4.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Спасибо, заработало: 
Код

typedef void (*pFunction)(SDL_KeyboardEvent *key);

void function(pFunction pF, SDL_KeyboardEvent *key) {
    pF(key);
}

//PrintKeyInfo(&e->event.key);
function(PrintKeyInfo, &e->event.key);


А про методы ничего нету? )

Код

this.button1.Click += new System.EventHandler(this.button1_Click);
 А вот такого ничего нету? )

Добавлено через 2 минуты и 55 секунд
оо, сколько ответов.

Цитата

многим лучше использовать обощённые функторы...
 мм, это как?

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

pFun f = &A::Fun;
 А если класс неизвестный?


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
archimed7592
Дата 30.4.2007, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Цитата(nerezus @  30.4.2007,  19:24 Найти цитируемый пост)
мм, это как?
boost::bind, boost::lambda, Loki::Function...
а вообще читай Александрску, Современное проектирование на С++ smile
Цитата(nerezus @  30.4.2007,  19:24 Найти цитируемый пост)
А если класс неизвестный? 
функторы smile
в двух словах - это объекты у которых перегружен operator ()


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
nerezus
Дата 30.4.2007, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



хм, тогда остается 2 варианта:
1) наследование нужного класса, из которого я хотел делать вызовы. Но тут проблемы, ибо он у меня Singleton
2) Strategy паттерн, но как-то хреново я его тут представляю....


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
archimed7592
Дата 30.4.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



3) использовать функторы smile 
скажи, а в чём проблема их использовать? smile
компилировать boost для них не нужно, если не ошибаюсь...
пример...вот те простейший пример:
Код
std::for_each (v.begin (), v.end (), std::cout << boost::lambda::_1 << '\n');
если контейнер map, то так:
Код
typedef std::map < int, std::string > container;
std::for_each (m.begin (), m.end (),
    std::cout << boost::bind<int> (&std::pair<int, std::string>::first, boost::lambda::_1)
    << '\t'
    << boost::bind<std::string> (&std::pair<int, std::string>::second, boost::lambda::_1)
    << '\n');


Добавлено через 3 минуты и 2 секунды
кстати, для map ты видишь как производится доступ к членам (полям/методам)... функтор возвращённый boost::bind можно засунуть, скажем, в boost::function (или Loki::Function) и вызывать не зная ни класса, ни метода... ничего...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
archimed7592
Дата 30.4.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



про возможности boost::bind
про возможности boost::lambda (не встречавшим конструкций if_then/try_catch и т.п. рекомендую - сильно впечатляет в первый раз smile)
про возможности boost::function

nerezus, конкретно твоя задача решается примерно так:
Код
class A
{
    boost::function1< void, const st & > func_;
public:
    set_action (boost::function1< void, const st & > func) {func_ = func;}
    do_action (const st &arg) {func (arg);}
};

void simple_fun (const st &arg) {};
void simple_fun_many_args (const st &arg, int, double) {};

class B
{
public:
    void member_fun (const st &arg) {};
};

int main ()
{
    A a;
    B b;
    a.set_action (simple_fun);
    a.do_action ();
    a.set_action (boost::bind<void> (simple_fun_many_args, boost::lambda::_1, 5, 67.85));
    a.do_action ();
    a.set_action (boost::bind<void> (&B::member_fun, boost::lambda::ref(x), boost::lambda::_1));
    a.do_action ();

    return 0;
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
nerezus
Дата 30.4.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Блин, как-то некрасиво получается =\
Я вот думаю, может стоит попытаться заюзать готовый фреймворк? Просто ща я пытался структурный код SDL переделать в ООП(при практически нулевых знаниях С++) и столкнулся с сабжем.

Добавлено через 1 минуту и 2 секунды
archimed7592, за код спасибо. А можешь выложить либы буста для этого примера?


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Любитель
Дата 30.4.2007, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(nerezus @  30.4.2007,  21:20 Найти цитируемый пост)
Блин, как-то некрасиво получается =\

nerezus, ты просто не почувствовал красоты в понятии плюсов smile

На мой взгляд, буст (и особенно бустовское ФП) - это самое красивое в плюсах smile


--------------------
PM MAIL ICQ Skype   Вверх
nerezus
Дата 30.4.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

nerezus, ты просто не почувствовал красоты в понятии плюсов
 Вероятно. Да и ща я не от хорошей жизни в плюсы залез. Надо будет PyGame проверить.. )

Цитата

буст (и особенно бустовское ФП) - это самое красивое в плюсах
 ФП? Оно заключается в названии lambda и map? В других языках на порядок получше )


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
archimed7592
Дата 30.4.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Любитель, всецело и полностью согласен smile с++ вообще очень красивый язык smile

nerezus,
Код
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/function.hpp>
#include <boost/ref.hpp>
если ты об этом... smile
если нужен сам буст, то на boost.org тебе дорога...

Добавлено через 2 минуты и 26 секунд
Цитата(nerezus @  30.4.2007,  23:13 Найти цитируемый пост)
Оно заключается в названии lambda и map?
нет, map к функциональному программированию отношения не имеет smile
скажи для начала в каких языках есть такие же мощные средства для ФП smile я имею ввиду ООП/императивные языки т. к. на чисто-функциональных языках писать, имхо, невозможно smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Любитель
Дата 30.4.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(archimed7592 @  30.4.2007,  23:15 Найти цитируемый пост)
 на чисто-функциональных языках писать, имхо, невозможно

Всё-таки позволю не согласиться...

Прикол плюсов в достаточно виртуозной реализации многих вещей (не только ФП) без явной поддержки этого со стороны языка. Это красиво. В определённом роде.

Добавлено через 1 минуту и 34 секунды
Питон - это хороши, интересно... Но красоты я лично не вижу. Не привлекает. А програмерить на плюсах - приятно, блин!


--------------------
PM MAIL ICQ Skype   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1085 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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