Трюк, возможно ли это?

Есть идея, вызвать на выполнение определенный код,  после инициализации экземпляра объекта (класса) в памяти, не используя, его конструктор.Сразу не понятно, конкретно, о чем идет речь, по этому приведу пример.
class TClass2 {  public:  TClass2()  {        MessageBox(0,”Some code executed”,”;)”,0);     };  ~TClass2(){};};class TClass1{   TClass2 Class2;  public:  TClass1(){};  ~TClass1(){};};TClass1 *obj = new TClass1();
В приведенном примере сразу после инициализации obj появится сообщение MessageBox.При этом конструктор класса TClass1 не задействован. Так вот хотелось бы выполнить подобное в рамках класса TClass1, да так чтобы код, например того же мессаджбокса мог оперировать с параметром.  MessageBox(0,arg,”;)”,0);К сожалению, подобная конструкция в c++ не разрешена:
class TClass2 {  public:  TClass2(char *arg)  {        MessageBox(0,arg,”;)”,0);     };  ~TClass2(){};};class TClass1{   TClass2 Class2(“Some code executed”);  public:  TClass1(){};  ~TClass1(){};};
Есть ли другая возможность выполнить подобное? 
14 ответов

Почему ты уверен, что конструктор класса не задействован. При создании объекта, автоматически вызывается конструктор данного объекта. Спрячь конструктор в protected область в первом примере. Сразу получиш от компилятора кучу мата.С++ не допускает иницилизирование переменных параметрами в объявлении класса. Выход из этой ситуации для тебя, 
class TClass1{   TClass2 *Class2;  public:  TClass1(){Class2 = new TClass2(“Some code executed”);};  ~TClass1(){delete Class2;};};


Так, понятно, похоже я недостаточно ясно объясни, что собственно хочу сделать. Мне необходимо добиться того, чтобы конструктор класса TClass1 не был задействован, но при инициализации экземпляра класса TClass1 выполнился код (функция) с параметром. Как реализовать данное без параметра я описал в первом примере, про то, что второй пример синтаксически неверен, я тоже написал, но в нем отражена суть того, что я хочу видеть.


vaddsm, От того, что ты хочеш видеть, не изменяет принципы работы ООП. И синтаксиса С++. Сделай через статик. есть несколько минусов. Но жить будет. Если хочеш чесать левое ухо правой ногой.
class TClass1{   static TClass2 Class2;  public:  TClass1(){};  ~TClass1(){};};TClass2 TClass1::Class2("Some code executed");
Лучше опиши, зачем тебе это нужно, может быть есть другие и более стандартные пути решения твоей задачи. Чем придумывать разные хаки.


не необходимо добиться того, чтобы конструктор класса TClass1 не был задействован, но при инициализации экземпляра класса 
Нельзя создать объект в С++, не задействовав конструктор. Если Вы не определяете конструктора, то это делает за Вас компилятор.
второй пример синтаксически неверен, я тоже написал, но в нем отражена суть того, что я хочу видеть.
используйте список инициализации :
class TClass1{   TClass2 m_obj_of_class2;  public:  TClass1(): m_obj_of_class2(“Some code executed”) {};  ~TClass1(){};};


чтобы конструктор класса TClass1 не был задействован
при инициализации экземпляра класса TClass1 выполнился код (функция) с параметром
не замечаешь противоречий?


  Афтар видит в этом магию Девида БлейнаЗЫ: Извините не удержался.


Нельзя создать объект в С++, не задействовав конструктор. Если Вы не определяете конструктора, то это делает за Вас компилятор.
Ты это к чему сказал то? Разве из моего сообщения следует, что я хочу создать ОБЪЕКТ не задействовав в этом мероприятии его КОНСТРУКТОР. Прошу перед тем, как что либо  писать, внимательно вникать в суть поставленной задачи. Еще раз! Мне надо выполнить код при создании объекта, но при этом недолжно быть явного использования конструктора.
TClass1(): m_obj_of_class2(“Some code executed”) {}; 
Это тоже, явно противоречит тому, что я писал. Еще раз: не размещая кода в конструкторе.Пример:
protected:SOME_STAFF_BEGIN DO_SOME_WORK(…) DO_SOME_WORK(…) DO_SOME_WORK(…)SOME_STAFF_ENDTClass1(){};~TClass1(){};
Например в VCL есть подобная реализация, таблица регистрирующая функции-обработчики оконных сообщений. 
#define BEGIN_MESSAGE_MAP                           \    virtual void __fastcall Dispatch(void *Message) \    {                                               \            switch  (((PMessage)Message)->Msg)      \            {#define VCL_MESSAGE_HANDLER(msg,type,meth)          \                case    msg:                        \                    meth(*((type *)Message));       \                    break;#define END_MESSAGE_MAP(base)                       \                default:                            \                    base::Dispatch(Message);        \                    break;                          \            }                                       \    }
Проблема, в том что, метод Dispatch применяется в самом классе в нужном месте и в нужное время. В моем случае я делаю произвольную надстройку на любой класс и он о моем подобии Dispatch ни сном не духом, по этому приходится прописывать вызов этого метода еще и в конструкторе класса, что не очень френдли-юзер.Как бы избавится от дополнительной писанины в конструкторе. Чтобы на этапе описания полей класса уже были созданы все условия для вызова метода.Рассмотрю любые идее и хаки в том числе, в силу того что моя надстройка собственно и есть грязный хак.2vinter
Цитата(vaddsm @  6.9.2008,  04:10 )чтобы конструктор класса TClass1 не был задействованЦитата(vaddsm @  6.9.2008,  04:10 )при инициализации экземпляра класса TClass1 выполнился код (функция) с параметромне замечаешь противоречий?
А какие здесь противоречия? В первом представленном примере, как раз так и происходит, проблем только в том, что без параметра. Конструктор TClass1 явным образом не задействован а сообщение появляется (MessageBox).


Как бы избавится от дополнительной писанины в конструкторе. Чтобы на этапе описания полей класса уже были созданы все условия для вызова метода.
для этого у классов должен быть предок, конструктор которого и делает, что тебе надо (в данном случае вызывает Dispatch)Добавлено через 2 минуты и 46 секундесли в Dispatch нужен параметр, то у тебя 2 варианта1. чтобы твой класс передавал что надо в вызове конструктора родителя2. чтобы конструктор родителя использовал глобальную (можно статическую) переменную, в которую ты заранее должен записать нужное значение.а чтобы куда-то не знаю куда само передавалось что-то, не знаю что - так не бывает


Что ж, проблеск понимания (Alek86) появился, и это замечательно! 
для этого у классов должен быть предок, конструктор которого и делает, что тебе надо
Наличие такого исключается, необходима реализация для любого класса.
а чтобы куда-то не знаю куда само передавалось что-то, не знаю что - так не бывает
Что, куда, а самое главное для чего я знаю на 100% (а что, я где то дал повод в этом сомневаться?). Я не знаю пока только, как и возможно ли? Предлагаю рассмотреть, такой пример: В классе есть метод, необходимо его выполнить сразу после инициализации объекта в памяти, при этом конструктор класса должен оставаться незадействованным в вызове этого метода.


Наличие такого исключается, необходима реализация для любого класса.
не выйдетя допишу с1.cpp
class C1 {};
и всеа если (чтобы побороть мой пример) хочешь извращаться, и делать подобные "фичи"
#define class ERROR_BAD_CLASS_DEFINITION# define CLASS_BEGIN /*реализация*/# define CLASS_END /*реализация*/
то (кроме того, что тебе нужна поддержка прекомпилед хедеров (она не везде есть)) пусть земля тебе будет пухом, ибо никто (включая тебя) потом твою прогу не поймети выражения типа
Что ж, проблеск понимания
Что, куда, а самое главное для чего я знаю на 100% (а что, я где то дал повод в этом сомневаться?).
прибереги, пожалуйста, для школьников.тут большинство людей намного больше тебя в С++ разбираются, и если, по-твоему, они говорят не о том, что тебе надо, то это ТЫ виноват, так как плохо объяснилиначе тебе просто накидают кучу минусов и, с мотря на твой рейт, никто тебе на форуме и пытаться помочь не будет


Alek86, прежде всего спасибо за желание помочь. Но как то ты агрессивно настроен, в словах проблеск понимания, имелось ввиду, что ты и есть тот самый проблеск, ведь до тебя в сути вопроса не разобрался никто. Так, что это скорее был комплимент. Затем, я бы не брался утверждать сразу, что знаю язык лучше тебя, так, как не видел твоего кода и с тобой лично не общался. По этому выражение “тут большинство людей намного больше тебя в С++ разбираются”, ты уж прости но звучит не очень зрело. Вопрос действительно на первый взгляд, касается основы основ, но это не говорит о том что его решение примитив.Давай прекратим словесную перепалку, и вернемся к сути вопроса. Прежде всего, почему ты счел 
class C1 {};
станет граблями на пути реализации моей идеи. В документации я могу явно указать, что блок 
SOME_STAFF_BEGIN DO_SOME_WORK(…) DO_SOME_WORK(…) DO_SOME_WORK(…)SOME_STAFF_END
Необходимо описать в protected секции класса. Тогда, правильное его применение будет иметь форму:
class C1 {protected:SOME_STAFF_BEGIN DO_SOME_WORK(…) DO_SOME_WORK(…) DO_SOME_WORK(…)SOME_STAFF_END};
Другое дело, понуждать пользователя писать еще код в конструкторе 
C1(){SOME_STAFF _INIT};


А какие здесь противоречия? 
конструктор класса TClass1 не был задействован
при инициализации экземпляра класса TClass1
ясно?
Предлагаю рассмотреть, такой пример: В классе есть метод, необходимо его выполнить сразу после инициализации объекта в памяти, при этом конструктор класса должен оставаться незадействованным в вызове этого метода.
В С++ это невозможно.


2vinter. Эти цитаты я так понял, были взяты из этого предложения:
Конструктор класса TClass1 не был задействован, но при инициализации экземпляра класса TClass1 выполнился код
А где в нем собственно противоречие? 
class TClass1{   TClass2 Class2;  public:  TClass1(){};  ~TClass1(){};};
Конструктор явно не задействован:
  TClass1(){};
А код всеже выполняется! (MessageBox)
В С++ это невозможно.
Вот и я с такими мыслями пришел на форум, но сколько раз убеждался на практике, что нет ничего невозможного. Может все же можно пойти на хитрость?


Вопрос остается в силе, Для чего данное действо вообше нужно?