|
|
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Еще минус - производный класс от класса задания (TimerTask) не имеет доступа к приватным методам и свойствам основного класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 16:03 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Кстати, хорошая статья про трудности с указателями на методы класса: http://]http://www.rsdn.ru/article/cpp/fastdelegate.xml ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 16:04 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
raven_unix Всего лишь создать абстрактный класс. Код классов менять даже не придется (только сделать их наследниками этого класса). Делать класс программы/модуля наследником класса таймера - не кажется мне хорошей идеей. 1. Если он пользует таймер, потоки, ... то от всего этого он должен наследоваться? 2. Он не сможет нормально пользовать несколько таймеров, т.к. функция таймаута одна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 16:08 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
raven_unixКстати, хорошая статья про трудности с указателями на методы класса: http://]http://www.rsdn.ru/article/cpp/fastdelegate.xml Хорошая статья. Было бы время, сел бы почитал, а пока нашел очень интересные замечания: Указатели на функции-члены и реализация самых быстрых делегатов на С++ рассмотрим файл, состоящий лишь из следующего кода. Это правильный код на С++. class SomeClass; typedef void (SomeClass::*SomeClassFunction) (void); void Invoke(SomeClass *pClass, SomeClassFunction funcptr) { (pClass->*funcptr)(); }; Заметьте, что компилятор генерирует ассемблерный код для вызова функции-члена через указатель, ничего не зная о классе SomeClass. Точнее, пока линковщик не выполнит крайне умудренную оптимизацию, код должен корректно работать независимо от настоящего определения класса. Прямое следствие из этого - можно безопасно вызывать метод класса через указатель на функцию-член, приведенный от указателя на функцию-член совершенно другого класса. Указатели на функции-члены и реализация самых быстрых делегатов на С++ Хитрость: приведение любого указателя на функцию-член к стандартной форме Основа моего кода – класс, который конвертирует произвольный указатель на класс и произвольный указатель на функцию-член в общий указатель на класс и общую функцию-член. В С++ нет типа «общая функция-член», поэтому я привожу к функциям-членам неопределенного класса CGenericClass. Ваши комментарии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 16:19 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Akh...Ваши комментарии? пока искал эту батву - сами раскопали... думал привидилось из си бимоля с его дилегатами...ан нет... угумс...дышать будет... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 16:29 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Можно и без наследования. Метод start делаем шаблонным, и передаем ему не указатель на метод класса, а фнкциональный объект - наследник unary_function или binary_function. Ну в оющем как в алгоритмах STL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 16:48 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Возникла проблема с приведением функции-члена: Код: plaintext 1. pult_wrapper.cpp:36: error: argument of type `void (Pult_wrapper::)(void*)' does not match `void (TimerGeneric::*)(void*)' Код: plaintext 1. pult_wrapper.cpp:36: error: ISO C++ forbids taking the address of an unqualified non-static member function to form a pointer to member function. Say `&Pult_wrapper::tRegisterPult' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 16:55 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
blindedМожно и без наследования. Метод start делаем шаблонным, и передаем ему не указатель на метод класса, а фнкциональный объект - наследник unary_function или binary_function. Ну в оющем как в алгоритмах STL Можно поподробней про это? Особенно про "функциональный объект". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 16:57 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
AkhВозникла проблема с приведением функции-члена:.... хе-хе... вот так усё пучком будет... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. изменённые имена думаю Вас не напугают...ну и самые нижнии строчки - вызов... (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 17:07 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
kolobok0изменённые имена думаю Вас не напугают...ну и самые нижнии строчки - вызов. Напугали. :) Мне кажиться, это не то, что я хочу. Мне надо подменить класс в первом параметре (что, проходит успешно) и притвориться, что я передаю, его функцию, предоставляя, на самом деле, указатель своей. В вашем примере такой замены я не обнаружил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 17:16 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Сделав подмену по синтаксису как посказал kolobok0, не создавая класса, а в его конструкторе, компиляция прошла успешно. Очень интересно, т.к. при указании, просто функции, понятно, что она подразумевается относительно this, но если она прописана как функция из области этого класса (и она не статическая), то синтаксес (мне кажется) более удален от привязки к конкретному объекту. Поэтому поведение компилятора мне кажется странным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 17:30 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
AkhСделав подмену... может всё таки с базовым-виртуальными посмотрите конструкцию ? Ведь по логике вещей обращаясь к декларированному интерфейсу (вирутальным методам) Вы будете не явно использовать именно то, что хотите юзать ручками. в таблице виртуальных методов именно адреса и валяются...обращаясь к таким методам процессор переходит именно по смещению на тот адресс который хранится в искомой ячейке. Минусов, тут не видно в принцепе (кстати не обязательно концентрировать обработку в наследнике и пытаться постучаться к приват данным. можно её переместить и в базовый класс, который по мере необходимости будет "запрашивать" необходимые "типизированные" данные).. А плюсы - это подведена концепция ООА, контроль при написании вызова - на уровне компиляции, оптимально реализованный код... Есть кстати очень интересные схемы юзанья именно данного подхода - использование виртуальных методов... На мой взгляд не плохо данную тематику раскрыл Джэфри Элджер в книге "C++". Например в ГУИ при обработке того или иного события от графики нужно привести полученный воид тип от неё, к нечто чёткому и позвать соответствующий метод. Проблема усложняется, если нуна по разному отрабатывать разные граф. сушности... После прочтения данной книги Вы выкинете нафик методы которые возвращают тип участвующих объектов и ненужные свитчи... Код станет более понятнее и будет контролироваться на этапе компиляции...просто и со вкусом... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 17:54 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
kolobok0 может всё таки с базовым-виртуальными посмотрите конструкцию ? ... Минусов, тут не видно в принцепе (кстати не обязательно концентрировать обработку в наследнике и пытаться постучаться к приват данным. можно её переместить и в базовый класс, который по мере необходимости будет "запрашивать" необходимые "типизированные" данные).. А плюсы - это подведена концепция ООА, контроль при написании вызова - на уровне компиляции, оптимально реализованный код... ... С точки зрения ООП - собака это дочерний объект от животного, но не от таймера. А как же тогда поступать с несколькими таймерами в одном классе? В этом подходе все будет через одну функцию, в ней появяться еще параметры, появяться свичи. Программа будет уже не такой наглядной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 18:15 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
AkhС точки зрения ООП - собака это дочерний объект от животного, но не от таймера. А как же тогда поступать с несколькими таймерами в одном классе? В этом подходе все будет через одну функцию, в ней появяться еще параметры, появяться свичи. Программа будет уже не такой наглядной. a) а мона исходную задачу? b) нужно сущность чаво ? c) И зачем куча таймеров ? d) задача свитча - точка "растипизации"...если у Вас один класс юзает кучу свитчей - то где тут "растипизация" ? просто трудно понять, что треба в конечном итоге.. (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 18:32 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 18:52 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
дауш. мне в с++ сильно не хватает такой фишки как в object pascal. пока обхожусь виртуальными функциями и иерархией(в том числе с множественным наследованием, полезная вещь!) но вот все думаю поднатареть еще маленько в шаблонах и переделать все на шаблонах :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 19:46 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
kolobok0 a) а мона исходную задачу? b) нужно сущность чаво ? c) И зачем куча таймеров ? d) задача свитча - точка "растипизации"...если у Вас один класс юзает кучу свитчей - то где тут "растипизация" ? просто трудно понять, что треба в конечном итоге.. а) Сейчас обсуждается, общая задача: а1) Утилита, производящая вызов каллбака задачи а2) Задача, котороя хотит зарегестирировать каллбаком свой метод. b) Любой приклодной задачи/класса с) могет быть. Задачи разные бывают. :) д) А как тогда раелизовать в одном каллбаке кучу таймеров? Задача имеет общее постановление, т.к. желательно чтобы, обсуждаемый метод ее решения был универсален. Т.е. вырабаталась определенная структура или проекция на определенные универсальные методы/структуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 10:06 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmo Код: plaintext 1. 2. 3. 4. 5. Было предложено 3 метода решения! Это к какому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 10:11 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Akhа1) Утилита, производящая вызов каллбака задачи а2) Задача, котороя хотит зарегестирировать каллбаком свой метод. b) Любой приклодной задачи/класса с) могет быть. Задачи разные бывают. :) д) А как тогда раелизовать в одном каллбаке кучу таймеров? всё равно, скажем так, остаються вопросы чаво хочется... и почему не устраивает наследование с виртуальными методами... пример... есть некий общий функционал (пускай будет потоковый класс, в задачи которого сводиться вся потоковая обвязка - синхроный старт, синхронный стоп, безопасная передача-приём параметров и куча всякой мелочёвки)... Никто не мешает передавать через "шлюзы" классы отнаследованные от некоего базового имеющего метод "Run". Этот метод уже будеть зваться в отдельном потоке с передачей ему потоковых данных (например открытые сокеты, базы либо ышо что)...всё... Теперь достаточно типизированный Ваш клас, прикрывающий определённую сущность отнаследовать от базового и перегрузить виртуальные методы типа Run, Initialize, DeInitialize... Так не катит ? Или я не так Вас понял? По поводу реализации в коллбэке "тучу таймеров" - тут что то не понятное...Т.е. сначала херим типизацию, а потом разгребаем ? Это типа из рода садо-мазо ? Ну можно... Думаю если обложить такой свитч ышо парочкой do-while будет круче смотреться...Правда мало толку, но зато как в старину - много строчек :) Или опять я, что то не понял ? удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 13:30 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
kolobok0 всё равно, скажем так, остаються вопросы чаво хочется... и почему не устраивает наследование с виртуальными методами... пример... есть некий общий функционал (пускай будет потоковый класс, в задачи которого сводиться вся потоковая обвязка - синхроный старт, синхронный стоп, безопасная передача-приём параметров и куча всякой мелочёвки)... Никто не мешает передавать через "шлюзы" классы отнаследованные от некоего базового имеющего метод "Run". Этот метод уже будеть зваться в отдельном потоке с передачей ему потоковых данных (например открытые сокеты, базы либо ышо что)...всё... Теперь достаточно типизированный Ваш клас, прикрывающий определённую сущность отнаследовать от базового и перегрузить виртуальные методы типа Run, Initialize, DeInitialize... Так не катит ? Или я не так Вас понял? По поводу реализации в коллбэке "тучу таймеров" - тут что то не понятное...Т.е. сначала херим типизацию, а потом разгребаем ? Это типа из рода садо-мазо ? Ну можно... Думаю если обложить такой свитч ышо парочкой do-while будет круче смотреться...Правда мало толку, но зато как в старину - много строчек :) Или опять я, что то не понял ? удачи Вам (круглый) Возмьмем ваш пример, в качестве основы. Вроде бы он подходит. Так вот, допустим вамему объекту, созданному по классу, дочернему к некоторому классу с функцией Run, надо заюзать несколько таких потоковых объектов. В этом случае вы создаете 2 этих объекта и каждому кидаете свою функцию Run. Тогда, как минимум, вам надо будет передовать в параметре, структуру, типа: Код: plaintext 1. 2. 3. 4. По второму пункту - похоже, что мы говорим о разных вещах. И еще вопрос: мне кажется, что наследовать собаку от потока не есть гуд, т.к. это не соответствует логике ООП. имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 13:45 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Подробнее... скоро дегьги буду брать:) Пoказываю # include <ctime> # include <iostream> # include <functional> template <typename Ret, typename T> class noarg_fun_t { public: typedef Ret (T::*F)(void); typedef Ret result_type; explicit noarg_fun_t(T& t, F f) : __p(t), __f(f) {} Ret operator() (void) { return (__p.*__f)(); } private: T& __p; F __f; }; template <typename T> class noarg_void_fun_t { public: typedef void (T::*F)(void); explicit noarg_void_fun_t(T& t, F f) : __p(t), __f(f) {} void operator() (void) { (__p.*__f)(); } private: T& __p; F __f; }; template <typename Arg, typename Ret, typename T> class arg_fun_t : public std::unary_function<Arg, Ret> { public: typedef Ret (T::*F)(Arg); explicit arg_fun_t(T& t, F f) : __p(t), __f(f) {} Ret operator() (Arg arg) { return (__p.*__f)(arg); } private: T& __p; F __f; }; template <typename Arg, typename T> class arg_void_fun_t : public std::unary_function<Arg, void> { public: typedef void (T::*F)(Arg); explicit arg_void_fun_t(T& t, F f) : __p(t), __f(f) {} void operator() (Arg arg) { (__p.*__f)(arg); } private: T& __p; F __f; }; class Timer { void wait(const timeval&) {} public: template <typename Func> Func start(Func func, const timeval& timeout) { wait(timeout); func(); return func; } template <typename Func, typename Arg> Func start(Func func, Arg arg, const timeval& timeout) { wait(timeout); func(arg); return func; } }; using namespace std; class A { public: void dump() { cout << "A::dump() called" << endl;} ostream& dump(ostream& out) { return out << "A::dump(ostream&) called" << endl; } }; int main() { A a; Timer tm; timeval timeout; typedef noarg_void_fun_t<A> Func1; typedef arg_fun_t<ostream&, ostream&, A> Func2; // И как он разобрал какую функцию выбрать??? tm.start(Func1(a, &A::dump), timeout); // Пришлость явно инстанциировать, иначе cerr юудет передаваться // как ostream, а y ios_base конструктор копирования в private tm.start<Func2, ostream&>(Func2(a, &A::dump), cerr, timeout); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 14:02 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
AkhВозникла проблема с приведением функции-члена: Код: plaintext 1. pult_wrapper.cpp:36: error: ISO C++ forbids taking the address of an unqualified non-static member function to form a pointer to member function. Say `&Pult_wrapper::tRegisterPult' Ну и ? Вам в сообщении об ошибке подсказывают: надо Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 16:09 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Akhа) Сейчас обсуждается, общая задача: а1) Утилита, производящая вызов каллбака задачи а2) Задача, котороя хотит зарегестирировать каллбаком свой метод.ну. Давно решённая задача. Чем тебя не устраивают обработчики событий? AkhБыло предложено 3 метода решения! Это к какому?приведение типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 16:12 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
BarloneНу и ? Вам в сообщении об ошибке подсказывают: надо Уже разобрался 11 топиков вверх. ;) Топик от 17:30 вчера (лень ссылку ставить :) ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 16:15 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
AkhВозмьмем ваш пример, в качестве основы. Вроде бы он подходит. Так вот, допустим вамему объекту, созданному по классу, дочернему к некоторому классу с функцией Run, надо заюзать несколько таких потоковых объектов. В этом случае вы создаете 2 этих объекта и каждому кидаете свою функцию Run.хмм... так у тебя всё-таки утилита вызывает задачу или куча классов вызывают друг друга как хотят? Зачем такой хаос может понадобиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 16:19 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33923785&tid=2030627]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
94ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 498ms |

| 0 / 0 |
