Здравствуйте, Аноним, Вы писали:
А>Т.е. есть два конструктора CObject() и CObject(int val)
А>так вот хочестся кусок А>
А> i = 0; j=0;
А>
А>не повторять в двух конструкторах а оставить в одном
К сожалению, в текущей версии языка это невозможно, однако в рассмотрении комитета по стандартизации С++ соответствующее предложение находится, так что ждем следующих версий языка.
А пока — вынеси общее присваивание в какую-нито функцию типа init и зови ее изо всех конструкторов.
Либо воспользуйся auto_value Кодта.
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;
}
};
Здравствуйте, jazzer, Вы писали:
J>К сожалению, в текущей версии языка это невозможно, однако в рассмотрении комитета по стандартизации С++ соответствующее предложение находится, так что ждем следующих версий языка.
а какие противопоказания есть для вот такой фичи (слышал что это не очень хорошо):
Здравствуйте, _cb_, Вы писали:
__>а какие противопоказания есть для вот такой фичи (слышал что это не очень хорошо):
1) Затираются все базы и члены-данные (которые уже сконструированы к моменту входа в тело конструктора). Если у них нетривиальные деструкторы — получаем, как минимум, утечки.
2) Несовместимо с виртуальным наследованием.
L>Приватно/защищенно отнаследуйся от класса, инкапсулирующего i и j, и имеющего конструктор по умолчанию их обнуляющий.
Зачем потомков то плодить ради инициальзации , лучше уж init() вызвать.
А вообще это еще один "-" к C++ и "+" к C#.
Здравствуйте, Кодт, Вы писали:
К>2) Несовместимо с виртуальным наследованием.
А почему?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
К>>2) Несовместимо с виртуальным наследованием.
E>А почему?
1) Разное распложение в памяти. Виртуальная база лежит в целом объекте, но вне промежуточных баз. Поэтому new(this)Object() из конструктора промежуточной базы устроит buffer overrun, да и всё перепутает к тому же.
2) Разное поведение. Конструктору неявно передают флажок — создаётся ли объект целиком (и нужно настроить указатели, вызвать конструкторы виртуальных баз) или только промежуточную базу (её виртуальная база уже создана, указатели настроены). Способ передачи флажка зависит от реализации и синтаксически недоступен. placement new создаёт целый объект, а не вызывает конструктор подобъекта в том виде, как это мог возжелать программист.
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'
Здравствуйте, Кодт, Вы писали:
К>1) Разное распложение в памяти. Виртуальная база лежит в целом объекте, но вне промежуточных баз. Поэтому new(this)Object() из конструктора промежуточной базы устроит buffer overrun, да и всё перепутает к тому же. К>2) Разное поведение. Конструктору неявно передают флажок — создаётся ли объект целиком (и нужно настроить указатели, вызвать конструкторы виртуальных баз) или только промежуточную базу (её виртуальная база уже создана, указатели настроены). Способ передачи флажка зависит от реализации и синтаксически недоступен. placement new создаёт целый объект, а не вызывает конструктор подобъекта в том виде, как это мог возжелать программист.
Идея ясна. Хотя я так понял, что есчли нет виртуальных баз, то ничего страшного не случится (кроме повторных вызовов конструкторов баз и полей)?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Идея ясна. Хотя я так понял, что есчли нет виртуальных баз, то ничего страшного не случится (кроме повторных вызовов конструкторов баз и полей)?
Вместо того, чтобы успокаивать себя такими мыслями и практиковать UB-стиль — останься в рамках языка. То есть, двухступенчатая инициализация.
Тебе потребуется:
— чтобы все базы и члены были default-constructible, причём желательно — легковесными.
— завести функцию init (с разнообразными сигнатурами), которую вызывать из конструкторов.
Если в дальнейшем захочешь что-то переделать — такой подход обеспечит минимальные мучения. А фокусы с повторным конструированием — максимальные.