![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| vaddsm |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Есть идея, вызвать на выполнение определенный код, после инициализации экземпляра объекта (класса) в памяти, не используя, его конструктор.
Сразу не понятно, конкретно, о чем идет речь, по этому приведу пример.
В приведенном примере сразу после инициализации obj появится сообщение MessageBox. При этом конструктор класса TClass1 не задействован. Так вот хотелось бы выполнить подобное в рамках класса TClass1, да так чтобы код, например того же мессаджбокса мог оперировать с параметром. MessageBox(0,arg,”;)”,0); К сожалению, подобная конструкция в c++ не разрешена:
Есть ли другая возможность выполнить подобное? |
||||
|
|||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Почему ты уверен, что конструктор класса не задействован. При создании объекта, автоматически вызывается конструктор данного объекта. Спрячь конструктор в protected область в первом примере. Сразу получиш от компилятора кучу мата.
С++ не допускает иницилизирование переменных параметрами в объявлении класса. Выход из этой ситуации для тебя,
Это сообщение отредактировал(а) Fin - 6.9.2008, 02:06 -------------------- Пролетал мимо. |
|||
|
||||
| vaddsm |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Так, понятно, похоже я недостаточно ясно объясни, что собственно хочу сделать. Мне необходимо добиться того, чтобы конструктор класса TClass1 не был задействован, но при инициализации экземпляра класса TClass1 выполнился код (функция) с параметром. Как реализовать данное без параметра я описал в первом примере, про то, что второй пример синтаксически неверен, я тоже написал, но в нем отражена суть того, что я хочу видеть.
|
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
vaddsm, От того, что ты хочеш видеть, не изменяет принципы работы ООП. И синтаксиса С++.
Сделай через статик. есть несколько минусов. Но жить будет. Если хочеш чесать левое ухо правой ногой.
Лучше опиши, зачем тебе это нужно, может быть есть другие и более стандартные пути решения твоей задачи. Чем придумывать разные хаки. Это сообщение отредактировал(а) Fin - 6.9.2008, 10:51 -------------------- Пролетал мимо. |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Нельзя создать объект в С++, не задействовав конструктор. Если Вы не определяете конструктора, то это делает за Вас компилятор.
используйте список инициализации :
Это сообщение отредактировал(а) mes - 6.9.2008, 10:53 |
||||||
|
|||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| cutwater |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
ЗЫ: Извините не удержался. |
|||
|
||||
| vaddsm |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Ты это к чему сказал то? Разве из моего сообщения следует, что я хочу создать ОБЪЕКТ не задействовав в этом мероприятии его КОНСТРУКТОР. Прошу перед тем, как что либо писать, внимательно вникать в суть поставленной задачи. Еще раз! Мне надо выполнить код при создании объекта, но при этом недолжно быть явного использования конструктора.
Это тоже, явно противоречит тому, что я писал. Еще раз: не размещая кода в конструкторе. Пример:
Например в VCL есть подобная реализация, таблица регистрирующая функции-обработчики оконных сообщений.
Проблема, в том что, метод Dispatch применяется в самом классе в нужном месте и в нужное время. В моем случае я делаю произвольную надстройку на любой класс и он о моем подобии Dispatch ни сном не духом, по этому приходится прописывать вызов этого метода еще и в конструкторе класса, что не очень френдли-юзер. Как бы избавится от дополнительной писанины в конструкторе. Чтобы на этапе описания полей класса уже были созданы все условия для вызова метода. Рассмотрю любые идее и хаки в том числе, в силу того что моя надстройка собственно и есть грязный хак. 2vinter
А какие здесь противоречия? В первом представленном примере, как раз так и происходит, проблем только в том, что без параметра. Конструктор TClass1 явным образом не задействован а сообщение появляется (MessageBox). Это сообщение отредактировал(а) vaddsm - 6.9.2008, 14:27 |
||||||||||
|
|||||||||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
для этого у классов должен быть предок, конструктор которого и делает, что тебе надо (в данном случае вызывает Dispatch) Добавлено через 2 минуты и 46 секунд если в Dispatch нужен параметр, то у тебя 2 варианта 1. чтобы твой класс передавал что надо в вызове конструктора родителя 2. чтобы конструктор родителя использовал глобальную (можно статическую) переменную, в которую ты заранее должен записать нужное значение. а чтобы куда-то не знаю куда само передавалось что-то, не знаю что - так не бывает |
|||
|
||||
| vaddsm |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Что ж, проблеск понимания (Alek86) появился, и это замечательно!
Наличие такого исключается, необходима реализация для любого класса.
Что, куда, а самое главное для чего я знаю на 100% (а что, я где то дал повод в этом сомневаться?). Я не знаю пока только, как и возможно ли? Предлагаю рассмотреть, такой пример: В классе есть метод, необходимо его выполнить сразу после инициализации объекта в памяти, при этом конструктор класса должен оставаться незадействованным в вызове этого метода. |
||||
|
|||||
| Alek86 |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
не выйдет я допишу с1.cpp
и все а если (чтобы побороть мой пример) хочешь извращаться, и делать подобные "фичи"
то (кроме того, что тебе нужна поддержка прекомпилед хедеров (она не везде есть)) пусть земля тебе будет пухом, ибо никто (включая тебя) потом твою прогу не поймет и выражения типа
прибереги, пожалуйста, для школьников. тут большинство людей намного больше тебя в С++ разбираются, и если, по-твоему, они говорят не о том, что тебе надо, то это ТЫ виноват, так как плохо объяснил иначе тебе просто накидают кучу минусов и, с мотря на твой рейт, никто тебе на форуме и пытаться помочь не будет |
||||||||
|
|||||||||
| vaddsm |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Alek86, прежде всего спасибо за желание помочь. Но как то ты агрессивно настроен, в словах проблеск понимания, имелось ввиду, что ты и есть тот самый проблеск, ведь до тебя в сути вопроса не разобрался никто. Так, что это скорее был комплимент. Затем, я бы не брался утверждать сразу, что знаю язык лучше тебя, так, как не видел твоего кода и с тобой лично не общался. По этому выражение “тут большинство людей намного больше тебя в С++ разбираются”, ты уж прости но звучит не очень зрело. Вопрос действительно на первый взгляд, касается основы основ, но это не говорит о том что его решение примитив.
Давай прекратим словесную перепалку, и вернемся к сути вопроса. Прежде всего, почему ты счел
станет граблями на пути реализации моей идеи. В документации я могу явно указать, что блок
Необходимо описать в protected секции класса. Тогда, правильное его применение будет иметь форму:
Другое дело, понуждать пользователя писать еще код в конструкторе
Это сообщение отредактировал(а) vaddsm - 6.9.2008, 15:38 |
||||||||
|
|||||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| vaddsm |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
2vinter. Эти цитаты я так понял, были взяты из этого предложения:
А где в нем собственно противоречие?
Конструктор явно не задействован:
А код всеже выполняется! (MessageBox)
Вот и я с такими мыслями пришел на форум, но сколько раз убеждался на практике, что нет ничего невозможного. Может все же можно пойти на хитрость? |
||||||||
|
|||||||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Вопрос остается в силе, Для чего данное действо вообше нужно?
-------------------- Пролетал мимо. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |