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
Деятель
Команда клуба
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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #6 : 27-08-2004 10:25 » |
|
spiage, я то точно знаю... я сам этим вопросом задался месяц назад, только это было в соседнем форуме (который для ОС). А кнопочка сверху - это так... для понта, а не поиск. Я вот тоже сейчас поискал ради любопытства по строчке "функция член класс метод". Поиск по отдельным словам вываливает половину форума, а поиск по всем словам ничего не даёт. а тема была эта https://forum.shelek.ru/index.php/topic,3979.0.html&highlight=и сейчас я её найти смог лишь по автору и зная форум
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
spiage
Гость
|
|
« Ответ #7 : 27-08-2004 10:25 » |
|
Я пор то, что сначала поиском воспользовался по форуму, прежде чем спрашивать А тот код, который я привел - работает на половину... Точнее указатель действительно так можно получить, но вот работать потом с ним у меня так и не получилось... Ни один из компиляторов не смог разименовать указатель... Пришлось делать friend функцию Так что если кто-нить знает, как заставить работать для разименования указателя - милости прошу рассказать
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #8 : 27-08-2004 10:27 » |
|
spiage, можно - сегодня я в качестве поиска поработаю, а не дивижок этого форума.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Антон (LogRus)
|
|
« Ответ #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
Молодой специалист
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 » |
|
Ну ты серега даааал..... Человек у тебя спрашивает почему ЭТО ... не работает.... а ты ему такой пример!!! Не работает потому что this-функцию нельзя вызвать без указателя на обьект Значит надо хранить указатель на функцию вместе с указателем на обьект Что бы скрыть это от клиента (ему явно не интересно это знать) удобно использовать паттерн команда Вот собственно и все
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
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, ты ответь что-нить, а то мы уже флудить начали, а это не к добру
|
|
|
Записан
|
|
|
|
|