Chained constructors
От: seas  
Дата: 21.10.04 08:18
Оценка:
hi

Как я понимаю, C++ запрещает подобную конструкцию:

class Chained
{
public:
Chained()
{
_a = 1;
_b = 2;
}
Chained(int a) : Chained()
{
_a = a;
}
private:
int _a;
int _b;
};

Хотя Java разрешает.

Кто-нибудь знает почему так сделано?

Заранее спасибо за ответ,
seas
Re: Chained constructors
От: s_anatoli Украина http://koresha.org/sakhnik
Дата: 21.10.04 08:28
Оценка: :))
Здравствуйте, seas, Вы писали:

S>hi

S>Кто-нибудь знает почему так сделано?

Потому что (Януковича это не касается), можно сделать по-другому:
class Chained
{
public:
    Chained(int a=1, int b=2)
        : _a(a), _b(b)
    {
    }
};

Жизнь — это чудо! Только вперёд: sakhnik@jabber.kiev.ua
Re[2]: Chained constructors
От: seas  
Дата: 21.10.04 08:33
Оценка:
Это все понятно.
Но смысл вопроса таков, почему нельзя именно использовать chained constructors.
Т.е. использовать один конструктор только как часть инициализации и
вызывать его из другого.

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

Что-то мешает такой реализации, какие-то соображения
эффектиновсти, параллельное программирование или еще чего?
Какие факторы на этапе проектирования языка заставили
принять именно это решение?

Здравствуйте, s_anatoli, Вы писали:

_>Здравствуйте, seas, Вы писали:


S>>hi

S>>Кто-нибудь знает почему так сделано?

_>Потому что (Януковича это не касается), можно сделать по-другому:

_>
_>class Chained
_>{
_>public:
_>    Chained(int a=1, int b=2)
_>        : _a(a), _b(b)
_>    {
_>    }
_>};
_>
Re[3]: Chained constructors
От: s_anatoli Украина http://koresha.org/sakhnik
Дата: 21.10.04 08:39
Оценка:
Здравствуйте, seas, Вы писали:

S>Т.е. использовать один конструктор только как часть инициализации и

S>вызывать его из другого.
S>Что-то мешает такой реализации, какие-то соображения
S>эффектиновсти, параллельное программирование или еще чего?
S>Какие факторы на этапе проектирования языка заставили
S>принять именно это решение?

Прямого ответа я не знаю. Считаю, что использование параметров по-умолчанию позволяет добиться того же результата, что и использование цепочных конструкторов, то есть нет прямой надобности в них.
Если бы я разрабатывал компилятор, то был бы просто рад такой "горе с плеч".

Жизнь — это чудо! Только вперёд: sakhnik@jabber.kiev.ua
Re: Chained constructors
От: Bell Россия  
Дата: 21.10.04 09:31
Оценка: 2 (1) +1
Здравствуйте, seas, Вы писали:


S>Кто-нибудь знает почему так сделано?


Потому что этой функциональности легко можно добится "стандартными" средствами:

class A
{
   void init() { ... }
public:
   A() { init(); }
   A(int n){ init(); /*other_initialization*/}
};
Любите книгу — источник знаний (с) М.Горький
Re[2]: Chained constructors
От: gribunin Россия  
Дата: 21.10.04 09:35
Оценка: 1 (1) +1
Здравствуйте, Bell, Вы писали:

B>Потому что этой функциональности легко можно добится "стандартными" средствами:


Небольшая ремарка: некоторые вещи можно проинициализировать только в конструкторе (инициализацию ссылок-членов класса, вызов конструкторов с параметрами членов классов). Их в отдельную функцию init не запихнёшь.
----------------
Кирилл Грибунин
Re[2]: Chained constructors
От: degor Россия  
Дата: 21.10.04 09:39
Оценка:
_>Потому что (Януковича это не касается), можно сделать по-другому:
_>
_>class Chained
_>{
_>public:
_>    Chained(int a=1, int b=2)
_>        : _a(a), _b(b)
_>    {
_>    }
_>};
_>


Не надо так делать. Значения по умолчанию в конструкторах есть зло. Из серии "Нам не дано предугадать...".
Re[3]: Chained constructors
От: s_anatoli Украина http://koresha.org/sakhnik
Дата: 21.10.04 09:49
Оценка:
Здравствуйте, degor, Вы писали:

D>Не надо так делать. Значения по умолчанию в конструкторах есть зло. Из серии "Нам не дано предугадать...".


Вообще говоря, согласен. Но зло -- это отсутствие осторожности.
Разве мы перестаём пользоваться транспортом, поняв, что можем попасть в аварию?

Жизнь — это чудо! Только вперёд: sakhnik@jabber.kiev.ua
Re[3]: Chained constructors
От: BacCM Россия  
Дата: 21.10.04 10:44
Оценка:
Здравствуйте, seas, Вы писали:

S>Что-то мешает такой реализации, какие-то соображения

S>эффектиновсти, параллельное программирование или еще чего?
S>Какие факторы на этапе проектирования языка заставили
S>принять именно это решение?

Тоже было бы любопытно узнать. Обычно использую специальный метод для инициализационных действий, который вызывается из всех конструкторов, но это как-то "не по нашему"
... Люди делятся на 10 категорий: те кто понимают двоичное исчисление и тех кто не понимает
Re[4]: Chained constructors
От: degor Россия  
Дата: 22.10.04 11:46
Оценка:
D>>Не надо так делать. Значения по умолчанию в конструкторах есть зло. Из серии "Нам не дано предугадать...".

_>Вообще говоря, согласен. Но зло -- это отсутствие осторожности.

_>Разве мы перестаём пользоваться транспортом, поняв, что можем попасть в аварию?

Тут нужно много осторожности. Компилятор в праве использовать такой конструктор для неявного приведения, и вот тут нас ждут интересные эффекты.
Re[5]: Chained constructors
От: s_anatoli Украина http://koresha.org/sakhnik
Дата: 22.10.04 12:24
Оценка: 2 (1)
Здравствуйте, degor, Вы писали:

D>Тут нужно много осторожности.


Осторожность нужна повсюду. Как бы ни старался коммитет по стандартизации, всё-равно в языке останутся грабли.
Ведь "на кожну ямку соломинки не знайдеться..."

Жизнь — это чудо! Только вперёд: sakhnik@jabber.kiev.ua
Re[4]: Chained constructors
От: Igor Romanov СССР  
Дата: 22.10.04 12:43
Оценка:
Здравствуйте, BacCM, Вы писали:

BCM>Здравствуйте, seas, Вы писали:


S>>Что-то мешает такой реализации, какие-то соображения

S>>эффектиновсти, параллельное программирование или еще чего?
S>>Какие факторы на этапе проектирования языка заставили
S>>принять именно это решение?

BCM>Тоже было бы любопытно узнать. Обычно использую специальный метод для инициализационных действий, который вызывается из всех конструкторов, но это как-то "не по нашему"


Sun Workshop проглатывает
A::A()
, в VC++
this->A::A()
, gcc отвергает подобные шалости ))
--
Igor
Re: Chained constructors
От: alexeiz  
Дата: 23.10.04 07:27
Оценка: +1
Здравствуйте, seas, Вы писали:

S>hi


S>Как я понимаю, C++ запрещает подобную конструкцию:


...

S>Хотя Java разрешает.


S>Кто-нибудь знает почему так сделано?


Насколько я знаю, комитетом по стандартизации рассматривается предложение ввести такое в стандарт C++.
Re[3]: Chained constructors
От: Auster Ниоткуда  
Дата: 25.10.04 12:17
Оценка:
Здравствуйте, seas, Вы писали:

S>Что-то мешает такой реализации, какие-то соображения

S>эффектиновсти, параллельное программирование или еще чего?
S>Какие факторы на этапе проектирования языка заставили
S>принять именно это решение?

Помимо вашего кода в конструктор может содержать код инициализации указателя на таблицу виртуальных функций, etс. Не забывайте о множественном наследовании, наследовании с виртуальным базовым классом.. чего в java нет и в помине.. при этом внутреннее устройство "объекта" еще сложнее и сильно зависит от реализации. Наверно, автор и зарубил сабж. дабы не плодить неоднозначности и не усложнять реализацию.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[6]: Chained constructors
От: Stepkh  
Дата: 25.10.04 12:34
Оценка:
Здравствуйте, s_anatoli, Вы писали:

_>Здравствуйте, degor, Вы писали:


D>>Тут нужно много осторожности.


_>Осторожность нужна повсюду. Как бы ни старался коммитет по стандартизации, всё-равно в языке останутся грабли.

_>Ведь "на кожну ямку соломинки не знайдеться..."

Так надо ударно потрудиться на полях нашей необъятной Родины, шоб всем хватило
Re[7]: Chained constructors
От: s_anatoli Украина http://koresha.org/sakhnik
Дата: 25.10.04 12:46
Оценка:
Здравствуйте, Stepkh, Вы писали:

S>Так надо ударно потрудиться на полях нашей необъятной Родины, шоб всем хватило


Я же утверждаю другое: надо смотреть под ноги и ни на кого кроме себя не пенять, если всё-таки угодил.

Жизнь — это чудо! Только вперёд: sakhnik@jabber.kiev.ua
Re[2]: Chained constructors
От: Igor Romanov СССР  
Дата: 25.10.04 12:51
Оценка:
A>Насколько я знаю, комитетом по стандартизации рассматривается предложение ввести такое в стандарт C++.

Первоисточник?
--
Igor
Re[3]: Chained constructors
От: alexeiz  
Дата: 25.10.04 17:14
Оценка:
Здравствуйте, Igor Romanov, Вы писали:

A>>Насколько я знаю, комитетом по стандартизации рассматривается предложение ввести такое в стандарт C++.


IR>Первоисточник?


http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1581.pdf
Re[4]: Chained constructors
От: Igor Romanov СССР  
Дата: 26.10.04 08:17
Оценка:
A>http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1581.pdf

thanks!
--
Igor
Re[4]: Chained constructors
От: _nn_  
Дата: 26.10.04 09:51
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Здравствуйте, Igor Romanov, Вы писали:


A>>>Насколько я знаю, комитетом по стандартизации рассматривается предложение ввести такое в стандарт C++.


IR>>Первоисточник?


A>http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1581.pdf


А как будет работать наследование с этим ?
(Положим что можно вызывать конструкторы)

class A
{
 int i;
public:
 A() : A(0) {}
 A(int x) : i(x) {}
};

class B : public A
{
 int j;
public:
 B() : A(0), B(0,0) {} // 2 раза вызов конструктора А ?
 B(int x,int y) : A(x), j(y) {}
};

Надо будет поосторожней тогда с этой фичей обходиться
Или же придумают защиту от подобных конструкций ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.