В конструкторе вызвать конструктор
От: Аноним  
Дата: 14.05.05 08:46
Оценка:
Т.е. есть два конструктора CObject() и CObject(int val)

class CObject
{
  int i, j, i_val;
public:
  CObject();
  CObject(int val);
}

CObject::CObject()
{
   i = 0; j = 0;
}

CObject::CObject(int val)
{
   i = 0; j = 0;
   i_val = val;
}


так вот хочестся кусок
 i = 0; j=0;

не повторять в двух конструкторах а оставить в одном
т.е. что-то в духе
CObject::CObject()
{
   i = 0; j = 0;
}

CObject::CObject(int val):this()
{
   i_val = val;
}


но только что-то не компилится такой вариант..
Re: В конструкторе вызвать конструктор
От: jazzer Россия Skype: enerjazzer
Дата: 14.05.05 09:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Т.е. есть два конструктора CObject() и CObject(int val)


А>так вот хочестся кусок

А>
А> i = 0; j=0;
А>

А>не повторять в двух конструкторах а оставить в одном

К сожалению, в текущей версии языка это невозможно, однако в рассмотрении комитета по стандартизации С++ соответствующее предложение находится, так что ждем следующих версий языка.

А пока — вынеси общее присваивание в какую-нито функцию типа init и зови ее изо всех конструкторов.
Либо воспользуйся auto_value Кодта.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: В конструкторе вызвать конструктор
От: Аноним  
Дата: 14.05.05 10:47
Оценка:
J>К сожалению, в текущей версии языка это невозможно, однако в рассмотрении комитета по стандартизации С++ соответствующее предложение находится, так что ждем следующих версий языка.

J>А пока — вынеси общее присваивание в какую-нито функцию типа init и зови ее изо всех конструкторов.

J>Либо воспользуйся auto_value Кодта.


А какие в ниже приведенном коде проблеммы?


class CObject
{
  int i, j, i_val;
public:
  CObject()
  {
    i = 0; j = 0;
  }
  
  CObject(int val)
  {
    CObject();
    i_val = val;
  }
};
Re[3]: В конструкторе вызвать конструктор
От: Кодт Россия  
Дата: 14.05.05 10:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А какие в ниже приведенном коде проблеммы?

А>class CObject
А>{
А>  int i, j, i_val;
А>public:
А>  CObject()
А>  {
А>    i = 0; j = 0;
А>  }
  
А>  CObject(int val)
А>  {
А>    CObject(); /***/
А>    i_val = val;
А>  }
А>};


Смысловые. /***/ CObject() — это не вызов конструктора, а создание временного объекта. С немедленным последующим уничтожением.
Перекуём баги на фичи!
Re[2]: В конструкторе вызвать конструктор
От: _cb_  
Дата: 14.05.05 11:45
Оценка:
Здравствуйте, jazzer, Вы писали:

J>К сожалению, в текущей версии языка это невозможно, однако в рассмотрении комитета по стандартизации С++ соответствующее предложение находится, так что ждем следующих версий языка.


а какие противопоказания есть для вот такой фичи (слышал что это не очень хорошо):


new (this) CObject (4);


?

cb.
Re[3]: В конструкторе вызвать конструктор
От: Кодт Россия  
Дата: 14.05.05 12:10
Оценка: 4 (1)
Здравствуйте, _cb_, Вы писали:

__>а какие противопоказания есть для вот такой фичи (слышал что это не очень хорошо):


1) Затираются все базы и члены-данные (которые уже сконструированы к моменту входа в тело конструктора). Если у них нетривиальные деструкторы — получаем, как минимум, утечки.
2) Несовместимо с виртуальным наследованием.
Перекуём баги на фичи!
Re: В конструкторе вызвать конструктор
От: lastique  
Дата: 14.05.05 20:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Т.е. есть два конструктора CObject() и CObject(int val)


А>
А>class CObject
А>{
А>  int i, j, i_val;
А>public:
А>  CObject();
А>  CObject(int val);
А>}

А>CObject::CObject()
А>{
А>   i = 0; j = 0;
А>}

А>CObject::CObject(int val)
А>{
А>   i = 0; j = 0;
А>   i_val = val;
А>}
А>


А>так вот хочестся кусок

А>
А> i = 0; j=0;
А>

А>не повторять в двух конструкторах а оставить в одном
А>т.е. что-то в духе
А>
А>CObject::CObject()
А>{
А>   i = 0; j = 0;
А>}

А>CObject::CObject(int val):this()
А>{
А>   i_val = val;
А>}
А>


А>но только что-то не компилится такой вариант..


Приватно/защищенно отнаследуйся от класса, инкапсулирующего i и j, и имеющего конструктор по умолчанию их обнуляющий.
Re: В конструкторе вызвать конструктор
От: llirik  
Дата: 14.05.05 21:20
Оценка: -1
Здравствуйте, <Аноним>, Вы писали:

А>Т.е. есть два конструктора CObject() и CObject(int val)


А>
А>class CObject
А>{
А>  int i, j, i_val;
А>public:
А>  CObject();
А>  CObject(int val);
А>}

А>CObject::CObject()
А>{
А>   i = 0; j = 0;
А>}

А>CObject::CObject(int val)
А>{
А>   i = 0; j = 0;
А>   i_val = val;
А>}
А>


А>так вот хочестся кусок

А>
А> i = 0; j=0;
А>

А>не повторять в двух конструкторах а оставить в одном
А>т.е. что-то в духе
А>
А>CObject::CObject()
А>{
А>   i = 0; j = 0;
А>}

А>CObject::CObject(int val):this()
А>{
А>   i_val = val;
А>}
А>


А>но только что-то не компилится такой вариант..


CObject(int val)
 {
      CObject::CObject();
      i_val = val;
 }
... << RSDN@Home 1.1.4 beta 7 rev. 454>>
Re[2]: В конструкторе вызвать конструктор
От: Аноним  
Дата: 15.05.05 10:25
Оценка:
L>Приватно/защищенно отнаследуйся от класса, инкапсулирующего i и j, и имеющего конструктор по умолчанию их обнуляющий.
Зачем потомков то плодить ради инициальзации , лучше уж init() вызвать.
А вообще это еще один "-" к C++ и "+" к C#.
Re: В конструкторе вызвать конструктор
От: Igore Россия  
Дата: 15.05.05 15:32
Оценка: +1
А чем такой вариант не устраивает?

class Object
{
   int i,j,i_val;
public:
   Object(int val=0);
};

Object::Object(int val)
{
   i=0;
   j=0;
   i_val=val;
}
Re[4]: В конструкторе вызвать конструктор
От: Erop Россия  
Дата: 15.05.05 17:14
Оценка:
Здравствуйте, Кодт, Вы писали:

К>2) Несовместимо с виртуальным наследованием.


А почему?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: В конструкторе вызвать конструктор
От: Кодт Россия  
Дата: 16.05.05 06:42
Оценка:
Здравствуйте, Erop, Вы писали:

К>>2) Несовместимо с виртуальным наследованием.


E>А почему?


1) Разное распложение в памяти. Виртуальная база лежит в целом объекте, но вне промежуточных баз. Поэтому new(this)Object() из конструктора промежуточной базы устроит buffer overrun, да и всё перепутает к тому же.
2) Разное поведение. Конструктору неявно передают флажок — создаётся ли объект целиком (и нужно настроить указатели, вызвать конструкторы виртуальных баз) или только промежуточную базу (её виртуальная база уже создана, указатели настроены). Способ передачи флажка зависит от реализации и синтаксически недоступен. placement new создаёт целый объект, а не вызывает конструктор подобъекта в том виде, как это мог возжелать программист.
Перекуём баги на фичи!
Re: В конструкторе вызвать конструктор
От: D3D  
Дата: 16.05.05 07:58
Оценка: -4
Здравствуйте, Аноним, Вы писали:

А>Т.е. есть два конструктора CObject() и CObject(int val)


А>
А>class CObject
А>{
А>  int i, j, i_val;
А>public:
А>  CObject();
А>  CObject(int val);
А>}

А>CObject::CObject()
А>{
А>   i = 0; j = 0;
А>}

А>CObject::CObject(int val)
А>{
А>   i = 0; j = 0;
А>   i_val = val;
А>}
А>


А>так вот хочестся кусок

А>
А> i = 0; j=0;
А>

А>не повторять в двух конструкторах а оставить в одном
А>т.е. что-то в духе
А>
А>CObject::CObject()
А>{
А>   i = 0; j = 0;
А>}

А>CObject::CObject(int val):this()
А>{
А>   i_val = val;
А>}
А>


А>но только что-то не компилится такой вариант..


Попробуй так
CObject::CObject(int val)
{
   CObject();
   i_val = val;
}
А>[/ccode]
Re: В конструкторе вызвать конструктор
От: A. Fedotov Украина  
Дата: 16.05.05 08:20
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Т.е. есть два конструктора CObject() и CObject(int val)


А>
А>class CObject
А>{
А>  int i, j, i_val;
А>public:
А>  CObject();
А>  CObject(int val);
А>}

А>CObject::CObject()
А>{
А>   i = 0; j = 0;
А>}

А>CObject::CObject(int val)
А>{
А>   this->CObject::CObject();
А>   i_val = val;
А>}
А>



на 7-ке канает, не знаю насколько это по стандарту
Re[2]: В конструкторе вызвать конструктор
От: jazzer Россия Skype: enerjazzer
Дата: 16.05.05 08:37
Оценка:
Здравствуйте, A. Fedotov, Вы писали:

AF>Здравствуйте, Аноним, Вы писали:


А>>Т.е. есть два конструктора CObject() и CObject(int val)


А>>
А>>class CObject
А>>{
А>>  int i, j, i_val;
А>>public:
А>>  CObject();
А>>  CObject(int val);
А>>}

А>>CObject::CObject()
А>>{
А>>   i = 0; j = 0;
А>>}

А>>CObject::CObject(int val)
А>>{
А>>   this->CObject::CObject();
А>>   i_val = val;
А>>}
А>>



AF>на 7-ке канает, не знаю насколько это по стандарту


не по стандарту
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: В конструкторе вызвать конструктор
От: CrystaX Россия https://crystax.me/
Дата: 16.05.05 08:40
Оценка:
Здравствуйте, A. Fedotov, Вы писали:

AF>Здравствуйте, Аноним, Вы писали:


А>>Т.е. есть два конструктора CObject() и CObject(int val)


А>>
А>>class CObject
А>>{
А>>  int i, j, i_val;
А>>public:
А>>  CObject();
А>>  CObject(int val);
А>>};

А>>CObject::CObject()
А>>{
А>>   i = 0; j = 0;
А>>}

А>>CObject::CObject(int val)
А>>{
А>>   this->CObject::CObject();
А>>   i_val = val;
А>>}
А>>



AF>на 7-ке канает, не знаю насколько это по стандарту


"ComeauTest.c", line 16: error: a constructor or destructor may not have its
          address taken
     this->CObject::CObject();
                    ^

1 error detected in the compilation of "ComeauTest.c".


D:\Temp>gcc --version
gcc.EXE (GCC) 3.4.2 (mingw-special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


D:\Temp>gcc -c -o test.o test.cpp
test.cpp: In constructor `CObject::CObject(int)':
test.cpp:16: error: invalid use of `class CObject'
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[6]: В конструкторе вызвать конструктор
От: Erop Россия  
Дата: 16.05.05 09:04
Оценка:
Здравствуйте, Кодт, Вы писали:

К>1) Разное распложение в памяти. Виртуальная база лежит в целом объекте, но вне промежуточных баз. Поэтому new(this)Object() из конструктора промежуточной базы устроит buffer overrun, да и всё перепутает к тому же.

К>2) Разное поведение. Конструктору неявно передают флажок — создаётся ли объект целиком (и нужно настроить указатели, вызвать конструкторы виртуальных баз) или только промежуточную базу (её виртуальная база уже создана, указатели настроены). Способ передачи флажка зависит от реализации и синтаксически недоступен. placement new создаёт целый объект, а не вызывает конструктор подобъекта в том виде, как это мог возжелать программист.

Идея ясна. Хотя я так понял, что есчли нет виртуальных баз, то ничего страшного не случится (кроме повторных вызовов конструкторов баз и полей)?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: В конструкторе вызвать конструктор
От: Кодт Россия  
Дата: 16.05.05 12:29
Оценка:
Здравствуйте, Erop, Вы писали:

E>Идея ясна. Хотя я так понял, что есчли нет виртуальных баз, то ничего страшного не случится (кроме повторных вызовов конструкторов баз и полей)?


Вместо того, чтобы успокаивать себя такими мыслями и практиковать UB-стиль — останься в рамках языка. То есть, двухступенчатая инициализация.
Тебе потребуется:
— чтобы все базы и члены были default-constructible, причём желательно — легковесными.
— завести функцию init (с разнообразными сигнатурами), которую вызывать из конструкторов.
Если в дальнейшем захочешь что-то переделать — такой подход обеспечит минимальные мучения. А фокусы с повторным конструированием — максимальные.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.