Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.26.176] |
|
Сообщ.
#1
,
|
|||||
|
Хочется "перенести" еще чуток кода с Дельфи в портируемый С++... Вопрос №1: Что делать с объявлениями такого вот типа
Пытаюсь нечто подобное найти в стандартном C++:
Но, мне кажется, это не совсем то! В первом случае, в Дельфи, можно переменную такого вот типа SomeMethod инициализировать любыми методами (конечно сходного формата объявления) любого класса. В случае же C++, для инициализации нельзя использовать функциb разных классов если классы не имеют общего предка с SomeClass? Или я ошибаюсь? Вопрос №2: Callback функции В некоторых обсуждениях я встречал мнения, что "грамотнее" передачу обобщенных действий делать в виде callback-функций, нежели переинициализацией указателя на функцию класса. Ну первое - не совсем понятен механизм как такое можно сделать. А второе - а как же "законченность" функциональности класса? Хелп, плиз! У кого какие соображения по поводу всего этого? Может какие примерчики есть грамотные? |
Сообщ.
#2
,
|
|
|
1) можно использовать функции разных классов. только нужно помнить, ччто у фукнции класса первый аргумент, коорый не пишется но подразумевается - указатель на класс. пресловутый this.
2) не совсем понял. callback фукнция - это самая обычная фукнция, адрес которой дают другой фукнции. ЗЫ в C# есть специальная фигня, называется delegate. |
Сообщ.
#3
,
|
|
|
Ну а на с++ эти делегаты реализуються с пощью шаблонов.
|
Сообщ.
#4
,
|
|||
|
Да это так. На самом деле и в Делфи можно сказать почти так же, так как в Делфи все классы наследуются от TObject. |
Сообщ.
#5
,
|
|||||||
|
Все оказалось гораздо хуже Не зря таки придумали господа из Борланда описатель __closure для своего ЦБилдера. Именно он полностью заменяет Дельфевый тру-ля-ля of object. Разница такова: переменная of object инициализируется функцией экземпляра класса, а то, что я приводил из стандартного С++, функцией класса. Однако самое неприятное, что при описании типа
Переменную типа SomeMethod я смогу проинациализировать только теми функциями класса, которые были в SomeClass! Иными словами, если я наследую от SomeClass другой класс и в нем определю новые функции, то ими я не могу проинициализировать переменную типа SomeMethod. Вот мля! Пример:
|
Сообщ.
#6
,
|
|
|
Используй статические функции с первым параметром - указателем на объект. Имеено так фактически и реализуются подобные вещи.
Delphi'йские class method - это фактически структура из двух указателей - указатель на метод и указатель на объект класса. |
Сообщ.
#7
,
|
|
|
В качестве варианта - попробуй boost::signal и boost::connection (http://www.boost.org)
|
Сообщ.
#8
,
|
|||
|
Посмотрел. Спасибо. Ну уж больно это громоздко, а получается всего лишь "прокладка" между обычным классом и "событием", реализуемым вне класса обычной функцией. Я уже смирился и вместо ссылки на метод, использую ссылку на функцию с передачей указателя на экземпляр класса. Немного некрасиво, но работает. Кстати почитал еще программерских форумов - там уж столько перемолото. Но все сходятся к отдному - в дополнение к классу писать функции-события отдельно, не как функции-класса. Ну ладо, думаю вопрос закрыт. |