Страниц: [1]
  Печать  
Автор Тема: Вызов одного конструктора из другого  (Прочитано 6240 раз)
oder
Гость
« : Октября 17, 2011, 01:57:59 am »

Сегодня придумал, как в C++ перевызвать один из перегруженных конструкторов из другого.

Типа
Код:
class Test
{
public:
  Test(const char *szLine, size_t nLength);
  Test(const char *szLine)
  {
    size_t nLength = strlen(szLine);
    // Перевызвать первый вариант конструктора
  }
}
Wink
Записан
lesav
Sr. Member
****
Offline Offline

Сообщений: 262



Просмотр профиля
« Ответ #1 : Октября 17, 2011, 12:25:59 pm »

Лавры этого "открытия" принадлежат другим людям. Брайну Керниган и Денис Ричи.   Cheesy
Записан

oder
Гость
« Ответ #2 : Октября 17, 2011, 12:53:36 pm »

Вы, таки, действительно полагаете, что такие великие люди опустились бы до использования такого грязного хака?  Wink  Grin
Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #3 : Октября 28, 2011, 01:50:48 pm »

Предполагаю что это некая шутка Smiley .. ибо первое апреля вроде еще не наступило)
Записан
oder
Гость
« Ответ #4 : Октября 28, 2011, 04:17:26 pm »

Ну, мой бывший "студент" (а теперь - разработчик) почти сразу догадался о чём я. Минута-две - не более.
Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #5 : Октября 28, 2011, 05:32:01 pm »

Шутка для "посвященных" .. не смешная шута Smiley
Записан
oder
Гость
« Ответ #6 : Октября 28, 2011, 05:41:16 pm »

Код:
class Test
{
public:
  Test(const char *szLine, size_t nLength);
  Test(const char *szLine)
  {
    size_t nLength = strlen(szLine);
    new(this) Test(szLine, nLength);
  }
}
Wink
Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #7 : Октября 28, 2011, 05:45:38 pm »

Тут более чем достаточно обсудили тему Smiley http://www.rsdn.ru/forum/cpp/160974.flat.1.aspx
Если сказано с долей шутки - то смишно)
Если более серьезно - то грустно Sad (решение кривое и ненадежное, а уж по производительности к которой вы постоянно стремитесь - и подавно).
Записан
oder
Гость
« Ответ #8 : Октября 28, 2011, 05:49:54 pm »

Ну я же говорил, что "грязный хак".  Grin
Вот только производительность тут никак не пострадает. С -O3 компилятор всё заинлайнит и получится просто strlen и вызов первого конструктора.
Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #9 : Октября 28, 2011, 06:02:39 pm »

Ну мне сомнительно что он все заинлайнит Smiley

Код:
class CArray
{
public:
  CArray(char * _pRawData)
  {
     // ну так уж получилось что заинллайнить ну никак этот конструктор компиллеру не удалось
     // какой-то ну необычно простой код (точнее сложный :) )
  }

// еще что-то
};

class CFoo
{
public:
  CFoo()
   : mArray(NULL)
  {
  }

  CFoo(const std::string & _Name)
  : mName(_Name),
    mArray(NULL)
  {
    // пока не обращаем внимание на возможный полиморфизм (который может потребовать корректность вызова деструкторов)

    // вызываем какбэ заново конструктор (сколько раз мы будем "инициализировать" mArray ??)
    new(this) CFoo();
  }

private:

  std::string mName;
  CArray mArray;
};

« Последнее редактирование: Октября 28, 2011, 06:05:55 pm от lastcross » Записан
oder
Гость
« Ответ #10 : Октября 28, 2011, 06:06:09 pm »

Вы меня полностью раскололи и повергли!  Grin
Хотя, я говорил только о своём конкретном случае, конечно. Wink
Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #11 : Октября 28, 2011, 06:14:11 pm »

Я же говорил - что не посвященным в "вашу шутку" - несмишно Smiley Пошутили б что ли про конструктор копий в полиморфном классе.. который из родительского можно вызвать базовый (тоже специфичным способом) Smiley

Зато насколько помнится в новом стандарте - "ваш" хак уже никому ненужен Smiley
« Последнее редактирование: Октября 28, 2011, 06:22:07 pm от lastcross » Записан
Страниц: [1]
  Печать  
 
Перейти в: