|
|
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
На счет статического понятно - можно, а вот, обычный метод, почему нельзя? Даже, если прописать объект, которому он пренадлежит? Типа такого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 13:00 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Че за юх, при явном привидении типа?: матершина компилятора pult_wrapper.cpp:7: error: argument of type `void (Pult_wrapper::)(short unsigned int, unsigned char*, short unsigned int)' does not match `void (*)(short unsigned int, unsigned char*, short unsigned int)' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 13:12 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
А объявление func() можно увидеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 13:15 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
raven_unixА объявление func() можно увидеть? А какая разница? Он не может сделать явное приведение типов. Но для представления, сейчас выкину листинги ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 13:26 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 13:29 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Просто приведение из типа "указатель на метод класса" к типу "указатель на функцию" невозможно. При вызове метода класса ему всегда передается указатель this. Если бы возможно приведение к типу "указатель на функцию", то откуда компилятор бы взял указатель this. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 13:34 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
raven_unixПросто приведение из типа "указатель на метод класса" к типу "указатель на функцию" невозможно. При вызове метода класса ему всегда передается указатель this. Если бы возможно приведение к типу "указатель на функцию", то откуда компилятор бы взял указатель this. При вызове конструктора класса, он знает указатель на this, т.к. это указатель объекта, который создается . Поэтому он может посчитать , где будет указатель на функцию создаваемого объекта . Не понятно, почему не возможно приведение к типу "указатель на функцию"??? PS: То, что в конструкторе и функциях класса, this подразумевается, сам собой, это понятно. В данном случае, я его указал для наглядности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 13:47 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Я понимаю, что в Вашем примере указатель this был приведен только для наглядности. Я говорю о том, что две совсем разные операции - вызов простой функции и вызов метода класса. При вызове функции, происходит переход на адрес функции и передача параметров, а при вызове метода класса дополнительно происходит передача указателя this. Или Вы хотите, чтобы указатель был как на простую функцию, а компилятор знал, что это не простая функция, а метод класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 14:17 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Можно, всё можно, там тип вызова надо указать правильно Вот например определение метода, вызывающегося при событии (Билдер): Код: plaintext Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 14:20 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
С this наконец-то мне доперло. :) Тогда вопрос - а как это сделать в обычных С++? __closure он не понимает в принципе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 14:41 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
__closur, если я не ошибаюсь - фишка Borland'a А без этого надо заменить Код: plaintext на Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 14:49 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
raven_unix__closur, если я не ошибаюсь - фишка Borland'a А без этого надо заменить Код: plaintext на Код: plaintext А без имени класса можно? Типа, сказать, что это будет класс, но какой не скажу. Пусть молча сохраняет this и передает. Как в Борланде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 14:55 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
AkhКак в Борланде хочешь как в бормане, в нём и пиши :) Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 14:57 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас AkhКак в Борланде хочешь как в бормане, в нём и пиши :) Это точно. Не позоляет С++ так делать. А жаль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:05 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
raven_unix ru> Не позоляет С++ так делать. ru> А жаль. Моё ИМХО состоит в том, что должна быть возможность и в других реализациях, в той же МСВЦ Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:06 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Надо Вам пересмотреть структуру классов, программы, чтобы не надо было использовать указатели на методы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:14 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас AkhКак в Борланде хочешь как в бормане, в нём и пиши :) Чур меня, чур. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:16 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
raven_unixНадо Вам пересмотреть структуру классов, программы, чтобы не надо было использовать указатели на методы. У меня модули, кои являются классами. А они пользуют утилиты разные, тоже мной написанные, типа, таймер, поток,... которые вызывают каллбаки. Так вот эти каллбаки, должны являться методами моих классов. То бишь: 1. Утилиты ничего не знают про классы, они лишь могут знать, что метод какого-то класса надо вызывать. 2. Любой модуль реализован ввиде класса и добавлять к модулю отдельную функцию очень не хочется. Использовать статик, не хорошо, но приходится. Надо сделать как-то покрасивши. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:20 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас raven_unix ru> Не позоляет С++ так делать. ru> А жаль. Моё ИМХО состоит в том, что должна быть возможность и в других реализациях, в той же МСВЦ Это моя надежда. :) Но мне, собственно говоря, надо чтобы это реализовалось по стандарту, во первых компилятор gcc, а во вторых, чтобы на все случаи жизни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:22 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Появилась одна мысль! Может сделать как в жабе? Timer и TimerTask? Здесь не будет проблем с С++? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:24 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Может можно завести общий класс-предок ? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:26 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Карабас БарабасМожет можно завести общий класс-предок ? По определению, любая утилита не может знать никакой не специфичный для нее класс. Наследовать, же специфичные классы от чего попало, тоже не хорошо. Сейчас мне кажется, что мой вариант, единственно возможный, тем более, что при вызове каллбака, хорошим стилем является указание, к чему этот класс относится; если я не ошибаюсь, этим и ялвяется Sender в борланде (как билдер, так и делфя). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:34 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Я не очень в java, не знаю структуру их классов Вообще можно сделать так: создать абстрактный класс (интерфейс), где перечислить все методы, которые Вам нужно вызывать. После этого надо сделать все необходимые классы наследниками этого интерфейса. После этого в функции тип параметра будет указатель на этот интерфейс. И все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:36 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
raven_unixЯ не очень в java, не знаю структуру их классов Вообще можно сделать так: создать абстрактный класс (интерфейс), где перечислить все методы, которые Вам нужно вызывать. После этого надо сделать все необходимые классы наследниками этого интерфейса. После этого в функции тип параметра будет указатель на этот интерфейс. И все. Мне кажется, что мы имеем ввиду одно и тоже. Получается что-то, вроде этого: Код: 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. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Минус подхода - приходится создавать еще один класс, т.е. функция обработки таймаута, находится в другом классе. Не знаю пока, как это расценивать с точки зрения подхода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 15:50 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Да точно, так я и думал. Не вижу минусов. Всего лишь создать абстрактный класс. Код классов менять даже не придется (только сделать их наследниками этого класса). Мне кажется, самый удобный подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2006, 16:02 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
всё равно даже в случае полного хаоса класс, предоставляющий регистрацию лисенера должен наследовать соотв. интерфейс, скажем, EventProvider, а класс, регистрирующий коллбак наследует интерфейс EventListener и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 16:22 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmo Akhа) Сейчас обсуждается, общая задача: а1) Утилита, производящая вызов каллбака задачи а2) Задача, котороя хотит зарегестирировать каллбаком свой метод.ну. Давно решённая задача. Чем тебя не устраивают обработчики событий? AkhБыло предложено 3 метода решения! Это к какому?приведение типов. 1. Оно и есть. Реализация? Отличие от сред разработки - не может быть, в принципе, единого родителя (так как есть разные утилиты и они существуют отдельно друг от друга). Множественное наследование? Разные родители, могут иметь одинаковые интерфейсные функции. Наследовать мышь от кота тоже не хорошо. 2. А куда это втыкается? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 16:23 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmo AkhВозмьмем ваш пример, в качестве основы. Вроде бы он подходит. Так вот, допустим вамему объекту, созданному по классу, дочернему к некоторому классу с функцией Run, надо заюзать несколько таких потоковых объектов. В этом случае вы создаете 2 этих объекта и каждому кидаете свою функцию Run.хмм... так у тебя всё-таки утилита вызывает задачу или куча классов вызывают друг друга как хотят? Зачем такой хаос может понадобиться? Утилиты вызывает задачу. Общий случай: задача подключает 40 объектов одного класса, 30 другого и так далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 16:25 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmoвсё равно даже в случае полного хаоса класс, предоставляющий регистрацию лисенера должен наследовать соотв. интерфейс, скажем, EventProvider, а класс, регистрирующий коллбак наследует интерфейс EventListener и всё. Начинаю склоняться в эту сторону (интерфейсов).... Необходимо правельно проэктировать основной класс. Допустим класс собака, существует не просто как класс, а содержит еще классы. 1-я нога, 2-я нога, которые можно пронаследовать от интерфейса таймера, который будет двигать эти ного. Вообщем, что-то в этом роде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 16:29 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Дадут вам сторонюю библиотеку и скажут что надо к вашим таймерам прицепить. А там 100 классов, да еще с наследованием. Ну и как не устанем к интерфейсу таймера их подключать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 17:33 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
blindedДадут вам сторонюю библиотеку и скажут что надо к вашим таймерам прицепить. А там 100 классов, да еще с наследованием. Ну и как не устанем к интерфейсу таймера их подключать? Предлагаем какой-то метод, который подойдет для всех интерфейсов? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 17:46 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
А чем плохо с шаюлонным start? Там ежели подумать то и указатель на функцию можно пихнуть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 19:34 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
AkhНаследовать мышь от кота тоже не хорошо.никто и не просит. Наследуй их от мохнатого четвероногого жывотного. Akh2. А куда это втыкается? ;)ну у тебя же проблемы были с приведением типов. Ладно, забей, всё равно это ересью было. AkhУтилиты вызывает задачу. Общий случай: задача подключает 40 объектов одного класса, 30 другого и так далее.а проблема в чём? Утилиту с задачей связать или кучу классов с задачей? AkhНачинаю склоняться в эту сторону (интерфейсов).... Необходимо правельно проэктировать основной класс. Допустим класс собака, существует не просто как класс, а содержит еще классы. 1-я нога, 2-я нога, которые можно пронаследовать от интерфейса таймера, который будет двигать эти ного.уже лучше. А зачем тут таймер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 11:47 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
ага... кажется, понял... ты хочешь регистрировать в таймере произвольные методы объектов для выполнения по таймауту? Хмм... точно не знаю... в мфц это делается, кажется, с помощью костылей. Насчёт qt не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 11:54 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
В мфц я что-то вообще не нашёл класса таймера :) В спп.нет обработчик коннектится через делегат :) (если метод нестатический, указывается объект, к которому применять метод). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 12:25 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Мужики! А меня что игнорируют или просто не заметили (там на 2ой странице) Дернул же не знаю что, не знаю у кого, да еще м неизвестным аргументом. Ежели это не устраивает, то можно из Alexandresku (БИБЛИОТЕЧКА LOKI) взять Functor и перепереть под эту задачку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 13:00 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
скольких, однако, трудов стоит написать на спп жалкое подобие делегата :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 14:46 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmo не наезжай на великий и могучий Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 14:48 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmoскольких, однако, трудов стоит написать на спп жалкое подобие делегата :) По сравнению с функтором Александреску C# делегаты глюкавое убожество ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 15:14 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmoскольких, однако, трудов стоит написать на спп жалкое подобие делегата :) и трудов там не меньше, M$ их просто спрятало. ILDasm покажет где ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 15:15 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
хмм... о чём это ты? Мне ildasm весьма красиво пишет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 16:12 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmoхмм... о чём это ты? Мне ildasm весьма красиво пишет. красиво. и немного ПОДРОБНЕЕ чем в исходнике на C# ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 16:33 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Ну да, подробнее, но всё делается именно так, как предполагается. И нет приведений типов, как в стихах blinded. А знаешь, что происходит, когда вызывается тот метод Timer::start ? В курсе, что этот метод будет размножаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 16:54 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmoНу да, подробнее, но всё делается именно так, как предполагается. И нет приведений типов, как в стихах blinded. Где я тип привел? Обижаете. Ни одного оператора приведения НЕТ!!! maXmo А знаешь, что происходит, когда вызывается тот метод Timer::start ? В курсе, что этот метод будет размножаться? Ну и пусть компилер размножает, он железный. Зато я не стану машинисткой. И никто не заставит меня наследоваться от одного класса и без числа приводить типы. А что касается славной библиотеки им Alexandresku, то она не даром так называется (вспомним к/ф Маска) Ежеди кто в ней найдет multithread модель под UNIX скажите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 18:46 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Вот вам новый опус(на скрепке) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2006, 21:12 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmoВ курсе, что этот метод будет размножаться? в курсе ты действительно думаешь что это так сложно сделать на C++ ??? по мне так это ДЕШОФКА. авторЕжеди кто в ней найдет multithread модель под UNIX скажите а руки то тебе на что ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2006, 09:51 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) в курсе ты действительно думаешь что это так сложно сделать на C++ ??? по мне так это ДЕШОФКА. А я на лавры Гомера не претендую. так Агния Барто. Но в отличии от великих теоретиков, ежели и выеживаюсь, так аргументировано. Gluk (Kazan) а руки то тебе на что ??? А я ими девок щупаю. А вы пока читайте на ночь Александреску. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2006, 13:12 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
blindedА я ими девок щупаю. А вы пока читайте на ночь Александреску. Линк, плиз. ПС от автора топика :) : Сейчас не могу участвовать в дискусии, так как нет времени, а для участия мне надо ДУМАТЬ (т.к. этой темой не занималя, даже не знал, что можно функции каласса передовать в параметры). ПС 2: Если прийдете к конструктивным решениям, буду очень рад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2006, 10:00 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Akh, с Александреску все просто незабвенный Modern C++ design там целая глава посвящена функторам. Loki лежит здесь http://www.awl.com/cseng/titles/0-201-70431-5 но не факт что g++ сжует без приложения усилий с вашей стороны А передача метода класса в качестве параметра на самом деле основана на трюке с определением оператора () у вспомогательного класса. Внешне это выглядит как вызов функции, хотя таковым не является. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2006, 10:24 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
blindedежели и выеживаюсь, так аргументировано. Типа наезд ? Ой спасиба, парадавал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2006, 12:08 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
blindedГде я тип привел? Обижаете. Ни одного оператора приведения НЕТ!!!ну было такое: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:56 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
blindedВот вам новый опус(на скрепке)что-то мусор какой-то распаковывается... От меня вот тоже опус :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 17:36 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
то есть вот так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 17:46 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmo blindedГде я тип привел? Обижаете. Ни одного оператора приведения НЕТ!!!ну было такое: Код: plaintext 1. 2. Не, батенька, это не приведение типа, это явная инстанциация!!! две большие разницы. Это я я явно сказал компилятору какой метод я хочу вызвать, потому что он гад такой при неявной подстановке (сам умничал) вызывал tm.start<Func2, ostream>. Ну за опус извините, видно загрузился криво, повторяю. Там одно файло поэтому просто gz без tar ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2006, 11:17 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmoто есть вот так Это, как мне кажется есть, то, что и надо было. Вообщем, буду юзать в этом виде: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2006, 12:14 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
blindedТам одно файло поэтому просто gz без tarпонятно... Зачем в тар-то запаковано? Да ещё без расширения? В гз ведь можно без тара паковать. Эхх... линуксоиды... Учитесь, мля :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2006, 15:44 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Я по-поводу Делегата. Все здорово, но есль отдельные недостатки: 1) для подключения сторонних библиотек вме равно приходится писать... В случае моего последнего опуса, ежели продолжить специализацию TimerTaskT параметров эдак до 15(TYPELIST_15). То проблема закравается раз и навсегда, все сводится к декларации переменной нужного типа. 2) Приведение к типу void* и обратно. Может больно ударить, когда хочешь передать наследника вместо папы. Приходится писать конструкцию типа reinterpret_cast<void*>(static_cast<Parent*>(childPtr)) чтобы потом сделать reinterpret_cast<Parent*>(voidPtr) Ужас!!! этоже прочесть нельзя. И не говорите мне что в случае отсутствия множественного наследования все пройдет на ура, не пройдет! Сем налетел лет 6 назад, когда портировался под HP aCC. Забавный компилятор, у него папа в наследнике начинается со смещением в слово. Вот вспотел тогда код шерстить.... PS Я не linuxoid, я unixoid. За своб недолгую я попробовал SCO, Linux, Solaris, HP-UX (risk и ia64) и AIX PSS Спасибо Akh, чоть кому-то что-то пригодилось... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2006, 16:13 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
а зачем нужен reinterpret_cast<void*> ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2006, 16:26 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
описанная тобой проблема, насколько я знаю, возникает только при приведении типов parent<->child ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2006, 16:33 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Код: 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. 25. 26. 27. 28. 29. 30. 31. 32. 33. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2006, 17:31 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
кстати, TYPELIST_1(P1) - это макрос? Можно на него глянуть? Как он отреагирует на конструкцию с запятыми? Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 11:17 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
Да, уж как в том анекдоте : Обосновал, но припохабнейше...Сейчас буду топтать, но сначала про reinterpret_cast - это привычка, я всегда когда из.в void* его пишу, оно при чтении глаз мозолит сразу видно где гадость... По-поводу приведения: 1) его можно просто забыть или сознательно не написать. Компилятор вам об этом ничего не скажет. Более того в большинстве случаев это сходит с рук. Согласитесь что множественное наслдование не часто встречается, а при одинарном большинство компиляторов сгенерят работающий код. Так у меня и было пока aCC не встретился. Сами понимаете мало приятного везде "работает", а на HP нет и отметим нигде в доках ничего о особенностях размещении объкта в памяти нет. Результат - несколько часов дебагере а потом еще куча времени чтобы прошерстить массу кода. 2) Привестись можно "неправильно". Что собственно вы и сделали. Приведение типа в стиле С в С++ - семантический маразм, никогда нельзя быть уверенным что приведется правильно. Не верите мне, отсылаю к гуру Дизайн и эволюция языка С++, там целая глава о приведении типа, вам читать с середины главы. В нашем конкретном случае вы нарушили права доступа к объекту, наследование то у вас private. А завтра выйдет новая версия библиотеки где автор уберет наследование и заменит его делегированием и вас перестанет работать, а компилятор ничего не скажетю А не првы были вы ибо автор библиотеки ничего с публичным интерфейсом не сделал.. Кстати если бы вы написали static_cast то хороший компилятор поймал бы вас за руку. GCC таким не оказался( у меня 3.2) Пришлось intel доставать, он поймал за руку. А так я не против void*, просто если можно без него обойтись, надо обходится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 12:09 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
blindedА завтра выйдет новая версия библиотеки где автор уберет наследование и заменит его делегированием и вас перестанет работать, а компилятор ничего не скажет. А не првы были вы ибо автор библиотеки ничего с публичным интерфейсом не сделал.это однозначно смена интерфейса (если в терминах COM). И это уже не относится к первоначально указанной тобой проблеме передачи парента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 13:59 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
интерфейс - это не просто список методов, это вся иерархия классов. К тому же, если ты на этих шаблонах напишешь библиотеку, тебе придётся поставлять её в сорсах, что влечёт за собой такой момент, что при любом изменении реализации TimerTaskT, тебе придётся перекомпилировать все модули, где он используется, а как ты помнишь, Akh очень не любит это делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 16:08 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
maXmoAkh очень не любит это делать. Этточно. ;) PS: в обсуждение не вникал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 17:28 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
AkhPS: в обсуждение не вникал.если нужна мощная защита от дурака, рекомендуют использовать шаблоны вместо void* ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 17:48 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
на случай, если ломает писать по делегату на каждую сигнатуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 17:51 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
По-моему пора завязывать. Решать все равно Akh_у. А тема высосана до дна, пусть лучше Akh еще чего-нибудь спросит у него ъто здорово получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 19:26 |
|
||
|
Почему нельзя передавать параметром метод класса?
|
|||
|---|---|---|---|
|
#18+
blindedПо-моему пора завязывать. Решать все равно Akh_у. А тема высосана до дна, пусть лучше Akh еще чего-нибудь спросит у него ъто здорово получается. Вообще, то я уже давно решил как буду делать, сообщений этак 30 назад. Но читать топик интересно. :) Спрошу, спрошу. Когда вопросы будут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2006, 09:50 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2030627]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
149ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
90ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 485ms |

| 0 / 0 |
