![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
но задействован ;) попробуй на досуге задницей через форточку вылезти, стандартную форточку совестких домов при инициализации объекта выполняется только конструктор(конструктор копирования) и больше ничего. Все остальное надо вызывать отдельно, либо из самого конструктора. Можно конечно сделать класс обертку, через который будут созадваться все объекты. Так же этот класс будет выполнять некую функциональность при создании. Но это сильно ограничит параметаризаию создаваемых объектов. |
|||
|
||||
| vaddsm |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Тут ооочень из далека заходить надо, чтобы полностью вопрос раскрыть. Но можно и в кратце: Есть набор функций, которые реализуют некоторое преобразование полей класса, скажем изменяют поведение некоторых методов этого класса.
Например, установив служебное слово virtual перед методом void __fastcall Method1();, мы указываем компилятору, что необходимо сделать данную функцию виртуальной и внести ее в VMT, DYNAMIC соответственно в DMT. У меня реализовано некоторое подобие VMT, но методы заносятся туда не на стадии компиляции а уже в рантайме. Собственно, для функций, которые реализуют с методами класса, нужные мне действия я пишу удобный интерфейс. Чтобы, это было настоль же лаконично и просто, как поставит фразу virtual в начале метода. Не нагружать пользователя сложными конструкциями, которые нужно прописывать в различные области класса (в том числе в конструктор). Например так как я писал:
Но, пока не придумал варианта проще чем, еще и в конструктор вносить
P.S Предлагаю пока откинуть универсальные кроссплатформенные методы, если таких нет для решения данной задачи, и сосредоточить внимание на средах BCB и VS. Любые конструктивные идеи приветствуются! Это сообщение отредактировал(а) vaddsm - 6.9.2008, 18:24 |
||||
|
|||||
| mes |
|
||||||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Не был задействован- означает не вызывается. Так что на ваш ответ могу ответить : прежде, чем спрашивать, сформулируйте нормально вопрос!
Вы наверно будете сильно удивлены, но в приведенном примере ни одна строчка не выполняется при инициализации. В том числе и метод Dispatch ().
Потому что задействован!!! конструктор по умолчанию Скорей всего можно.. если ясно сформулируете задачу, думаю, кто нибудь из форумчан подскажет Что скрыто тут ? :
Ну a если добавить в Ваш дефайн строчку добавляюшая в нужный класс регистратор(или другой вспомогательный объект) с конструктором по умолчанию ? Это сообщение отредактировал(а) mes - 6.9.2008, 18:44 |
||||||||||||
|
|||||||||||||
| vaddsm |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
mes
Вы наверно, будете еще больше удивлены обнаружив, в том посте, откуда вы взяли эти строчки, следующие слова: Проблема, в том что, метод Dispatch применяется в самом классе в нужном месте и в нужное время. В моем случае я делаю произвольную надстройку на любой класс и он, о моем подобии Dispatch ни сном не духом, по этому приходится прописывать вызов этого метода еще и в конструкторе… Мне даже обидно как-то, ведь я сам написал об этом подробно.
Ок, здесь действительно мои слова можно было понять не правильно. Сказав “Конструктор явно не задействован” я имел ввиду, что мы руками не прописываем сюда TClass1(){/*Ничего*/};. Хотя, компилятор, еще да точки /*Ничего*/ помещает инструкции вызывающие конструктор TClass2. А в котором, уже в свою очередь, следует код вызывающий MessageBox. |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Я расценил эти слова, что в Вашем коде надо прописывать вручную, а в VCL это делается автоматом. Но в примере не нашел ничего подобного. тем более что перед примером шла строчка :
тут по контексту возникает смысл, что регистрация происходит в момент инициализации.. Если Вы имели ввиду виртуальность Dispatch, (инициализацию указателя на VMT) то причем тут вобще VCL ? Это сообщение отредактировал(а) mes - 6.9.2008, 18:57 |
||||
|
|||||
| vaddsm |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
mes, все похоже, что Вы меня поняли. Искренне спаибо!
У меня так:
Проблема MSL_TABLE_INIT, приходится в конструктор класса помещать. P.S. Если после этого поста остаются еще вопросы, прошу задовать. Это сообщение отредактировал(а) vaddsm - 6.9.2008, 19:46 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Вам необходим this для вашей таблицы либо косвенно (как у вас в примере), либо прямо.
"Автоматически"при инициализации его можно получить только в конструкторе, того объекта, методы которого вам нужно делегировать. ИМХО, решить задачу, не затрагивая конструктора, нереально. |
|||
|
||||
| vaddsm |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Мне кажется Вы не туда акцент поставили в вопросе.
В данном исполнении у Вас, основная загвоздка на мой взгляд не в использовании конструктора, а в том , что пользователь может забыть добавить нужную строчку, для инициализации. Чтоб избежать подобного, надо научить компилятор сообщать об этом. Поэтому предлагаю реализовать описание таблицы внутри вспомогательного класса, для инициалиции которого требуется this основного. Тогда даже если пользователь добавит несколько конструкторов к основному классу, то компилятор не позволит не проинициализировать таблицу. |
|||
|
||||
| vaddsm |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Абсолютно, точно. Можно, конечно и ваш вариант, если я его правильно понял. Давайте на практике рассмотрим (простенький пример), того, что именно Вы имеете ввиду. Предположим дан вспомогательный класс Tmsl, у него есть метод void __fastcall dosomestuff(LPVOID PointerTo_PrimaryClass_Member); Вызывая данный метод я произвожу действия над членами основного класса. И допустим, есть основной класс, назовем его TPrimaryClass. Из данных условий, как ваша идея должна быть выражена в коде? |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
тем кто понял суть вопроса, расскажите в 2х словах...
вопрос поставлен не точно, что за метод, виртуальный, закрытый, статический... сразу напрашиваются два решения:
там где я работаю, за такой код могут и уволить... Это сообщение отредактировал(а) Lazin - 6.9.2008, 23:11 |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
задача: делегировать произвольные методы одного объекта объекту обработчику. Само делегирование проблем не вызывает. Вопрос как красиво оформить, чтоб клиент, мог интуитивно использовать библиотеку, и компилятор предупредил бы в случае ошибки/упущения. Добавлено @ 23:36
Не до конца понял, что имели тут ввиду. Как насчет такого? использование виртуальности для реализации callback'a
Это сообщение отредактировал(а) mes - 6.9.2008, 23:37 |
||||
|
|||||
| vaddsm |
|
||||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Возможно, оффтоп и все же, что не так в примере то? (в двух словах)
Есть класс, совершенно любой, со своим набором методов и свойств. И у нас есть универсальный инструмент (другой класс), совершающий действия над методами любого класса. Для этого инструмента надо написать удобный интерфейс. Пример, есть класс над которым совершается действо:
Применительно к нему, код выполняющий интерфейс для “Инструмента”, выглядит так:
Все замечательно, красиво, удобно, но приходится писать еще в конструктор:
А ооочень не хотелось бы. Пример дефайнов для TOOL_TABLE я выложил выше. Добавлено @ 23:46
Ну, ну нет не такая задача.
Вопрос, верный! Это сообщение отредактировал(а) vaddsm - 6.9.2008, 23:49 |
||||||||||||||
|
|||||||||||||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ради бога
вот вам и вызов сразу после инициализации)) Это сообщение отредактировал(а) Lazin - 7.9.2008, 00:09 |
|||
|
||||
| vaddsm |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Хотел вам mes + поставить за огромное стремление помочь, но не дают пока это сделать, говорят постов мало.
mes, пока не то. По последнему посту есть вопросы? |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |