Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как запихнуть функцию-член класса в параметр функции?  (Прочитано 7620 раз)
0 Пользователей и 1 Гость смотрят эту тему.
spiage
Гость
« : 27-08-2004 03:41 » 

Пример кода:
Код:
typedef void (*MyFunc)(int);
vector<MyFunc *> o;
void Registrate(MyFunc m) {
   o.push_back(m);
};
class MyClass {
public:
   int d;
   void AFunc(int i) { d = i * i; };
   MyClass() {
      Registrate((MyFunc)(&AFunc)); // что написать тут????????
      // постоянно выдает ошибку :(
   };
};
« Последнее редактирование: 30-11-2007 23:31 от Алексей1153++ » Записан
spiage
Гость
« Ответ #1 : 27-08-2004 04:07 » 

Урра!!!
MSDN - rulezzz
В общем делается это так:
Код:
class MyClass; // Предварительно говорим, что сделаем такой класс
typedef void (MyClass::*MyFunc)(int); // Начало магии
vector<MyFunc *> o;
void Registrate(MyFunc m) {
   o.push_back(m);
};
class MyClass {
public:
   int d;
   void AFunc(int i) { d = i * i; };
   MyClass() {
      Registrate(&MyClass::AFunc); // и второй кусочек заклинания
   };
};
Все работает как надо, вот ссылка на главу:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/c2276.asp
« Последнее редактирование: 30-11-2007 23:33 от Алексей1153++ » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 27-08-2004 05:52 » 

иэх... вот что значит отсутствие поиска на форуме Жаль
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Serega
Гость
« Ответ #3 : 27-08-2004 05:58 » 

Почему отсутствие ?
А кнопочка сверху для понта чтоли ? Отлично
Записан
spiage
Гость
« Ответ #4 : 27-08-2004 06:47 » 

dimka, Serega,
Если вы про то, что нечто подобное уже кто-то спрашивал, то не были ли столь любезны дать ссылку, т.к. поиск по форуму ничего не дал?
Записан
Serega
Гость
« Ответ #5 : 27-08-2004 09:59 » 

Я про то, что поиск всетаки есть
spiage, а ты про что ?
Код, что ты привел во втором посте это то что нужно или нет ?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 27-08-2004 10:25 » 

spiage, я то точно знаю... я сам этим вопросом задался месяц назад, только это было в соседнем форуме (который для ОС).

А кнопочка сверху - это так... для понта, а не поиск. Я вот тоже сейчас поискал ради любопытства по строчке "функция член класс метод". Поиск по отдельным словам вываливает половину форума, а поиск по всем словам ничего не даёт.

а тема была эта http://forum.shelek.ru/index.php/topic,3979.0.html&highlight=

и сейчас я её найти смог лишь по автору и зная форум Жаль
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
spiage
Гость
« Ответ #7 : 27-08-2004 10:25 » 

Я пор то, что сначала поиском воспользовался по форуму, прежде чем спрашивать Улыбаюсь
А тот код, который я привел - работает на половину...
Точнее указатель действительно так можно получить, но вот работать потом с ним у меня так и не получилось... Ни один из компиляторов не смог разименовать указатель... Жаль
Пришлось делать friend функцию Жаль
Так что если кто-нить знает, как заставить работать для разименования указателя - милости прошу рассказать
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 27-08-2004 10:27 » 

spiage, можно - сегодня я в качестве поиска поработаю, а не дивижок этого форума.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 27-08-2004 11:18 » 

spiage, вот зачем тебе только указатель на функцию класса модет тебе оно и не надо. Опять же функторы есть. Или ще так как делается при работе с STL когда требуется сделать полиморфный функтор для этого делается функтор-оболочка содержащий указатель на класс реализацию.
Хотя для передачи обычно хватает &Class::Func или так mem_fun(&Class::Func) или так mem_fun_ref(&Class::Func)
Или я чего не понял?  :?
Записан

Странно всё это....
Serega
Гость
« Ответ #10 : 27-08-2004 11:47 » 

Вот пример того, как можно сделать, если что непонятно почитай паттерн Command и задавай вопросы
Код:
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Command
{
public:
virtual void DoSomething(int) = 0;
};

template <class Type>
class CallMemberCommand : public Command
{
typedef void (Type::*MemberType)(int);

Type* object;
MemberType member;

public:
CallMemberCommand(Type* obj, MemberType func)
: object(obj), member(func)
{}

void DoSomething(int i)
{
(obj->*member)(i);
}
};

class TestClass
{
string name;

public:
TestClass(char* n) : name(n)
{}

Command* GetTestCommand()
{
return new CallMemberCommand<TestClass>(this, TestFunction);
}

void TestFunction(int i)
{
cout << "TestClass(" << name.c_str() << ")::TestFunction, given value = " << i << endl;
}
};


void main()
{
typedef vector<Command*> commands_container;
commands_container commands;

TestClass t1("test1"), t2("test2"), t3("test3");

commands.push_back(t1.GetTestCommand());
commands.push_back(t3.GetTestCommand());
commands.push_back(t2.GetTestCommand());

commands_container::iterator begin = commands.begin();
for(; begin != commands.end(); ++begin)
{
(*begin)->DoSomething(123);
}
}
Конечно это не хорошо хранить указатели в векторе, но это я думаю ты исправить сможешь
« Последнее редактирование: 30-11-2007 23:37 от Алексей1153++ » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #11 : 31-08-2004 21:28 » 

Ну ты серега даааал.....

Человек у тебя спрашивает почему ЭТО
Цитата

class MyClass; // Предварительно говорим, что сделаем такой класс
typedef void (MyClass::*MyFunc)(int); // Начало магии
vector<MyFunc *> o;
void Registrate(MyFunc m) {
   o.push_back(m);
};
class MyClass {
public:
   int d;
   void AFunc(int i) { d = i * i; };
   MyClass() {
      Registrate(&MyClass::AFunc); // и второй кусочек заклинания
   };
};

не работает.... а ты ему такой пример!!!
Записан

С уважением Lapulya
Serega
Гость
« Ответ #12 : 01-09-2004 06:29 » 

Цитата: lapulya
Ну ты серега даааал.....
Человек у тебя спрашивает почему ЭТО
Цитата
...

не работает.... а ты ему такой пример!!!

Не работает потому что this-функцию нельзя вызвать без указателя на обьект
Значит надо хранить указатель на функцию вместе с указателем на обьект
Что бы скрыть это от клиента (ему явно не интересно это знать) удобно использовать паттерн команда
Вот собственно и все
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #13 : 01-09-2004 17:37 » 

то Serega
да я то понял, вот только если человек не понимает почему его код не работает (а надо признать, что это достаточно простая вещь), то рекомендовать ему такое мощнейшее и достаточно сложное решение (загрузив его по самые гланды) думаю не лучшее решение, я это к тому написал что думаю, что твой совет слииииишком сложный для автора темы (НО могу и ошибатся..... ни кого обидеть не хотел :oops: )
Записан

С уважением Lapulya
Serega
Гость
« Ответ #14 : 01-09-2004 18:34 » 

На основании чего ты судишь о знаниях spiage ?
с stl он вроде знаком, к тому же я ничего кроме string и vector в примере и не использую
что такое интерфейс, наследование и полиморфизм не должно вызывать вопросов (в противном случае стоит для начала изучить ООП)
что такое указатель на функцию он тоже знает
а больше ничего и нету
Записан
Serega
Гость
« Ответ #15 : 01-09-2004 18:38 » 

to spiage, ты ответь что-нить, а то мы уже флудить начали, а это не к добру Отлично
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines