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: 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[5]: Chained constructors
От: s_anatoli Украина http://koresha.org/sakhnik
Дата: 22.10.04 12:24
Оценка: 2 (1)
Здравствуйте, degor, Вы писали:

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


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

Жизнь — это чудо! Только вперёд: sakhnik@jabber.kiev.ua
Re: Chained constructors
От: alexeiz  
Дата: 23.10.04 07:27
Оценка: +1
Здравствуйте, seas, Вы писали:

S>hi


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


...

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


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


Насколько я знаю, комитетом по стандартизации рассматривается предложение ввести такое в стандарт C++.
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[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[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[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[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
Re[8]: Chained constructors
От: degor Россия  
Дата: 26.10.04 09:53
Оценка:
_>Я же утверждаю другое: надо смотреть под ноги и ни на кого кроме себя не пенять, если всё-таки угодил.

Вы гоdорите с позициb человека, который один пишет всю программу. Но и в таком случае трудно контролировать случаи опасного использования языка.
Re[3]: Chained constructors
От: LaptevVV Россия  
Дата: 26.10.04 09:53
Оценка:
Здравствуйте, seas, Вы писали:

S>Это все понятно.

S>Но смысл вопроса таков, почему нельзя именно использовать chained constructors.
S>Т.е. использовать один конструктор только как часть инициализации и
S>вызывать его из другого.В С++ это можно делать с помощью определений чистых виртуальных функций. С помощью того, же, кстати, можно реализовать идиому виртуального конструктора.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: Chained constructors
От: alexeiz  
Дата: 26.10.04 09:56
Оценка:
Здравствуйте, _nn_, Вы писали:

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


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 раза вызов конструктора А ?
          ^^^^ - can't call base constructor if delegating constructor call exists
__> B(int x,int y) : A(x), j(y) {}
__>};
__>

__>Надо будет поосторожней тогда с этой фичей обходиться
__>Или же придумают защиту от подобных конструкций ?
Re[6]: Chained constructors
От: _nn_  
Дата: 26.10.04 10:01
Оценка:
Здравствуйте, alexeiz, Вы писали:

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


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


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


__>>А как будет работать наследование с этим ?

__>>(Положим что можно вызывать конструкторы)

A>На первый взгляд всё кажется не сложно. Запрещаем вызов базового конструктора, если происходит делегирование.


A> ^^^^ — can't call base constructor if delegating constructor call exists


В таком случае надо чтобы в делегируемом конструкторе был вызов базового класса в нужной форме:
class A
{
 int i;
public:
 A() : A(0) {}
 A(int x) : i(x) {}
};

class B : public A
{
 int j;
public:
 // B() : /*A(1),*/ B(0,0) {} // хотим A(1), а получим A(0)
 B() : B(1,0) {} // не забыть какой параметр идет в базовый класс
 B(int x,int y) : A(x), j(y) {}
};
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Chained constructors
От: LaptevVV Россия  
Дата: 26.10.04 10:03
Оценка:
Здравствуйте, LaptevVV, Вы писали:

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


S>>Это все понятно.

S>>Но смысл вопроса таков, почему нельзя именно использовать chained constructors.
S>>Т.е. использовать один конструктор только как часть инициализации и
S>>вызывать его из другого.
В С++ это можно делать с помощью определений чистых виртуальных функций. С помощью того, же, кстати, можно реализовать идиому виртуального конструктора.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: Chained constructors
От: achp  
Дата: 26.10.04 11:48
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Или же придумают защиту от подобных конструкций ?


Защита тривиальнейшая: конструктор либо выполняет работу (инициализирует базовые подобъекты и члены), либо делегирует (передает управление другому конструктору), но не то и другое одновременно.

Есть тонкость с разрушением. Допустим, имеем:

struct A
{
    A() : A(100)
    {
        throw 0;
    }
    
    A(int n) : 
    {
        m = new char[n];
    }
    
    ~A()
    {
        delete[] m;
    }
    
    char* m;
}

int main()
{
    A a;
}


Должен ли быть вызван деструктор A?
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Работа над ошибками
От: achp  
Дата: 26.10.04 11:50
Оценка:
A>
A>    A(int n) : 
A>    {
A>        m = new char[n];
A>    }
A>


Читать так:

    A(int n) : m(new char[n])
    {}
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Re: Chained constructors
От: Аноним  
Дата: 26.10.04 12:10
Оценка:
Здравствуйте, seas, Вы писали:

S>hi


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


S>class Chained

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

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


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


S>Заранее спасибо за ответ,

S>seas

afik, дело в деструкторе
пример:

class Chained {
public:
  Chained() { _a = 1; _b = 2; }
  Chained(int a) : Chained() { _a = a; throw 1; }
  ~Chained() { cout << "Chained dtor" << endl; }
private:
  int _a;
  int _b;
};

class Other {
  Chained member_;
public:
  Other() : member_(4) {}
};

int main() {
  try {
    Other other;
    // или Other* other = new Other; это неважно 
  } catch(...) {}
  return 0;
}



вопрос: вызовется ли деструктор Chained?
переформулируя: был ли создан объект Chained?


N.B. В Java это допустимо, т.к. деструкторов нету
Re[5]: Chained constructors
От: Аноним  
Дата: 05.01.05 21:11
Оценка:
Здравствуйте, degor, Вы писали:

D>Тут нужно много осторожности. Компилятор в праве использовать такой конструктор для неявного приведения, и вот тут нас ждут интересные эффекты.


для предотвращения этих эффектов есть ключевое слово explicit
Re[3]: Chained constructors
От: Lepsik Гондурас https://www.kirdyk.club/
Дата: 06.01.05 21:01
Оценка:
Здравствуйте, gribunin, Вы писали:

G>Небольшая ремарка: некоторые вещи можно проинициализировать только в конструкторе (инициализацию ссылок-членов класса, вызов конструкторов с параметрами членов классов). Их в отдельную функцию init не запихнёшь.


а что inline функции уже отменили ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.