QNX.ORG.RU

Разработка => Языки и алгоритмы => Тема начата: oder от Октября 17, 2011, 01:57:59 am



Название: Вызов одного конструктора из другого
Отправлено: 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);
    // Перевызвать первый вариант конструктора
  }
}
;)


Название: Re: Вызов одного конструктора из другого
Отправлено: lesav от Октября 17, 2011, 12:25:59 pm
Лавры этого "открытия" принадлежат другим людям. Брайну Керниган и Денис Ричи.   :D


Название: Re: Вызов одного конструктора из другого
Отправлено: oder от Октября 17, 2011, 12:53:36 pm
Вы, таки, действительно полагаете, что такие великие люди опустились бы до использования такого грязного хака?  ;)  ;D


Название: Re: Вызов одного конструктора из другого
Отправлено: lastcross от Октября 28, 2011, 01:50:48 pm
Предполагаю что это некая шутка :) .. ибо первое апреля вроде еще не наступило)


Название: Re: Вызов одного конструктора из другого
Отправлено: oder от Октября 28, 2011, 04:17:26 pm
Ну, мой бывший "студент" (а теперь - разработчик) почти сразу догадался о чём я. Минута-две - не более.


Название: Re: Вызов одного конструктора из другого
Отправлено: lastcross от Октября 28, 2011, 05:32:01 pm
Шутка для "посвященных" .. не смешная шута :)


Название: Re: Вызов одного конструктора из другого
Отправлено: oder от Октября 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);
  }
}
;)


Название: Re: Вызов одного конструктора из другого
Отправлено: lastcross от Октября 28, 2011, 05:45:38 pm
Тут более чем достаточно обсудили тему :) http://www.rsdn.ru/forum/cpp/160974.flat.1.aspx
Если сказано с долей шутки - то смишно)
Если более серьезно - то грустно :( (решение кривое и ненадежное, а уж по производительности к которой вы постоянно стремитесь - и подавно).


Название: Re: Вызов одного конструктора из другого
Отправлено: oder от Октября 28, 2011, 05:49:54 pm
Ну я же говорил, что "грязный хак".  ;D
Вот только производительность тут никак не пострадает. С -O3 компилятор всё заинлайнит и получится просто strlen и вызов первого конструктора.


Название: Re: Вызов одного конструктора из другого
Отправлено: lastcross от Октября 28, 2011, 06:02:39 pm
Ну мне сомнительно что он все заинлайнит :)

Код:
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;
};



Название: Re: Вызов одного конструктора из другого
Отправлено: oder от Октября 28, 2011, 06:06:09 pm
Вы меня полностью раскололи и повергли!  ;D
Хотя, я говорил только о своём конкретном случае, конечно. ;)


Название: Re: Вызов одного конструктора из другого
Отправлено: lastcross от Октября 28, 2011, 06:14:11 pm
Я же говорил - что не посвященным в "вашу шутку" - несмишно :) Пошутили б что ли про конструктор копий в полиморфном классе.. который из родительского можно вызвать базовый (тоже специфичным способом) :)

Зато насколько помнится в новом стандарте - "ваш" хак уже никому ненужен :)