Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трюк, возможно ли это? 
:(
    Опции темы
vaddsm
  Дата 6.9.2008, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Есть идея, вызвать на выполнение определенный код,  после инициализации экземпляра объекта (класса) в памяти, не используя, его конструктор.

Сразу не понятно, конкретно, о чем идет речь, по этому приведу пример.

Код

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(){};
};



Есть ли другая возможность выполнить подобное? 


PM MAIL   Вверх
Fin
Дата 6.9.2008, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Почему ты уверен, что конструктор класса не задействован. При создании объекта, автоматически вызывается конструктор данного объекта. Спрячь конструктор в protected область в первом примере. Сразу получиш от компилятора кучу мата.

С++ не допускает иницилизирование переменных параметрами в объявлении класса. Выход из этой ситуации для тебя, 
Код

class TClass1
{
 
  TClass2 *Class2;
  public:
  TClass1(){Class2 = new TClass2(“Some code executed”);};
  ~TClass1(){delete Class2;};
};


Это сообщение отредактировал(а) Fin - 6.9.2008, 02:06


--------------------
Пролетал мимо.
PM MAIL   Вверх
vaddsm
  Дата 6.9.2008, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Так, понятно, похоже я недостаточно ясно объясни, что собственно хочу сделать. Мне необходимо добиться того, чтобы конструктор класса TClass1 не был задействован, но при инициализации экземпляра класса TClass1 выполнился код (функция) с параметром. Как реализовать данное без параметра я описал в первом примере, про то, что второй пример синтаксически неверен, я тоже написал, но в нем отражена суть того, что я хочу видеть.
PM MAIL   Вверх
Fin
Дата 6.9.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



vaddsm, От того, что ты хочеш видеть, не изменяет принципы работы ООП. И синтаксиса С++. 

Сделай через статик. есть несколько минусов. Но жить будет. Если хочеш чесать левое ухо правой ногой.
Код

class TClass1
{
 
  static TClass2 Class2;
  public:
  TClass1(){};
  ~TClass1(){};
};

TClass2 TClass1::Class2("Some code executed");


Лучше опиши, зачем тебе это нужно, может быть есть другие и более стандартные пути решения твоей задачи. Чем придумывать разные хаки.

Это сообщение отредактировал(а) Fin - 6.9.2008, 10:51


--------------------
Пролетал мимо.
PM MAIL   Вверх
mes
Дата 6.9.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vaddsm @  6.9.2008,  03:10 Найти цитируемый пост)
не необходимо добиться того, чтобы конструктор класса TClass1 не был задействован, но при инициализации экземпляра класса 

Нельзя создать объект в С++, не задействовав конструктор. Если Вы не определяете конструктора, то это делает за Вас компилятор.

Цитата(vaddsm @  6.9.2008,  03:10 Найти цитируемый пост)
второй пример синтаксически неверен, я тоже написал, но в нем отражена суть того, что я хочу видеть.

используйте список инициализации :
Код

class TClass1
{
 
  TClass2 m_obj_of_class2;
  public:
  TClass1(): m_obj_of_class2(“Some code executed”) {};
  ~TClass1(){};
};





Это сообщение отредактировал(а) mes - 6.9.2008, 10:53


--------------------
PM MAIL WWW   Вверх
vinter
Дата 6.9.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(vaddsm @  6.9.2008,  04:10 Найти цитируемый пост)
чтобы конструктор класса TClass1 не был задействован


Цитата(vaddsm @  6.9.2008,  04:10 Найти цитируемый пост)
при инициализации экземпляра класса TClass1 выполнился код (функция) с параметром

не замечаешь противоречий?


--------------------
Мой блог
PM MAIL WWW   Вверх
cutwater
Дата 6.9.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



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



--------------------
user posted image
PM MAIL   Вверх
vaddsm
  Дата 6.9.2008, 14:16 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Цитата


Нельзя создать объект в С++, не задействовав конструктор. Если Вы не определяете конструктора, то это делает за Вас компилятор.




Ты это к чему сказал то? Разве из моего сообщения следует, что я хочу создать ОБЪЕКТ не задействовав в этом мероприятии его КОНСТРУКТОР. Прошу перед тем, как что либо  писать, внимательно вникать в суть поставленной задачи. 

Еще раз! Мне надо выполнить код при создании объекта, но при этом недолжно быть явного использования конструктора.


Код

TClass1(): m_obj_of_class2(“Some code executed”) {}; 


Это тоже, явно противоречит тому, что я писал. Еще раз: не размещая кода в конструкторе.

Пример:

Код


protected:

SOME_STAFF_BEGIN

 DO_SOME_WORK(…)
 DO_SOME_WORK(…)
 DO_SOME_WORK(…)

SOME_STAFF_END

TClass1(){};
~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).



Это сообщение отредактировал(а) vaddsm - 6.9.2008, 14:27
PM MAIL   Вверх
Alek86
Дата 6.9.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(vaddsm @  6.9.2008,  14:16 Найти цитируемый пост)
Как бы избавится от дополнительной писанины в конструкторе. Чтобы на этапе описания полей класса уже были созданы все условия для вызова метода.

для этого у классов должен быть предок, конструктор которого и делает, что тебе надо (в данном случае вызывает Dispatch)

Добавлено через 2 минуты и 46 секунд
если в Dispatch нужен параметр, то у тебя 2 варианта

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

а чтобы куда-то не знаю куда само передавалось что-то, не знаю что - так не бывает


--------------------
user posted image    user posted image
PM MAIL   Вверх
vaddsm
  Дата 6.9.2008, 15:01 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Что ж, проблеск понимания (Alek86) появился, и это замечательно! 

Цитата

для этого у классов должен быть предок, конструктор которого и делает, что тебе надо


Наличие такого исключается, необходима реализация для любого класса.

Цитата

а чтобы куда-то не знаю куда само передавалось что-то, не знаю что - так не бывает


Что, куда, а самое главное для чего я знаю на 100% (а что, я где то дал повод в этом сомневаться?). Я не знаю пока только, как и возможно ли? 


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

PM MAIL   Вверх
Alek86
Дата 6.9.2008, 15:10 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(vaddsm @  6.9.2008,  15:01 Найти цитируемый пост)
Наличие такого исключается, необходима реализация для любого класса.

не выйдет
я допишу с1.cpp
Код
class C1 {};

и все


а если (чтобы побороть мой пример) хочешь извращаться, и делать подобные "фичи"
Код

#define class ERROR_BAD_CLASS_DEFINITION

# define CLASS_BEGIN /*реализация*/
# define CLASS_END /*реализация*/

то (кроме того, что тебе нужна поддержка прекомпилед хедеров (она не везде есть)) пусть земля тебе будет пухом, ибо никто (включая тебя) потом твою прогу не поймет

и выражения типа
Цитата(vaddsm @  6.9.2008,  15:01 Найти цитируемый пост)
Что ж, проблеск понимания

Цитата(vaddsm @  6.9.2008,  15:01 Найти цитируемый пост)
Что, куда, а самое главное для чего я знаю на 100% (а что, я где то дал повод в этом сомневаться?).

прибереги, пожалуйста, для школьников.
тут большинство людей намного больше тебя в С++ разбираются, и если, по-твоему, они говорят не о том, что тебе надо, то это ТЫ виноват, так как плохо объяснил

иначе тебе просто накидают кучу минусов и, с мотря на твой рейт, никто тебе на форуме и пытаться помочь не будет


--------------------
user posted image    user posted image
PM MAIL   Вверх
vaddsm
  Дата 6.9.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



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

};



Это сообщение отредактировал(а) vaddsm - 6.9.2008, 15:38
PM MAIL   Вверх
vinter
Дата 6.9.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(vaddsm @  6.9.2008,  15:16 Найти цитируемый пост)
А какие здесь противоречия? 


Цитата(vaddsm @  6.9.2008,  15:16 Найти цитируемый пост)
конструктор класса TClass1 не был задействован


Цитата(vaddsm @  6.9.2008,  15:16 Найти цитируемый пост)
при инициализации экземпляра класса TClass1

ясно?

Цитата(vaddsm @  6.9.2008,  16:01 Найти цитируемый пост)
Предлагаю рассмотреть, такой пример: В классе есть метод, необходимо его выполнить сразу после инициализации объекта в памяти, при этом конструктор класса должен оставаться незадействованным в вызове этого метода.

В С++ это невозможно.


--------------------
Мой блог
PM MAIL WWW   Вверх
vaddsm
  Дата 6.9.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



2vinter. Эти цитаты я так понял, были взяты из этого предложения:

Цитата

Конструктор класса TClass1 не был задействован, но при инициализации экземпляра класса TClass1 выполнился код



А где в нем собственно противоречие? 


Код

class TClass1
{
 
  TClass2 Class2;

  public:

  TClass1(){};
  ~TClass1(){};
};



Конструктор явно не задействован:
Код


  TClass1(){};



А код всеже выполняется! (MessageBox)


Код

В С++ это невозможно.


Вот и я с такими мыслями пришел на форум, но сколько раз убеждался на практике, что нет ничего невозможного. Может все же можно пойти на хитрость?

PM MAIL   Вверх
Fin
Дата 6.9.2008, 17:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



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


--------------------
Пролетал мимо.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0633 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.