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...
Пока на собственное сообщение не было ответов, его можно удалить.