Конструктор. Ошибка C2614
От: zfima  
Дата: 28.09.09 08:51
Оценка: :)
Здрасте.
Коротко:
почему так можно

class area_cl{
public:
    int height;
    int width;
};

class cilinder: public area_cl{
public:cilinder(int h, int w){
    height = h;
    width = w;
    }
};



а так нет???

class area_cl{
public:
    int height;
    int width;
};

class cilinder: public area_cl{
public:cilinder(int h, int w): height(h), width(w){}
};



спасибо
Re: Конструктор. Ошибка C2614
От: Юрий Жмеренецкий ICQ 380412032
Дата: 28.09.09 09:21
Оценка:
Здравствуйте, zfima, Вы писали:

Z>почему так можно


[...]

Z>а так нет???


Z>
Z>class area_cl{
Z>public:
Z>    int height;
Z>    int width;
Z>};

Z>class cilinder: public area_cl{
Z>public:cilinder(int h, int w): height(h), width(w){}
Z>};
Z>


Вызов конструктора 'cilinder' должен привести к вызову конструктора area_cl, но запись ': height(h), width(w)' никак не может быть таким вызовом (формально, в этом контексте не будут найдены имена height/width).

Вызывать конструктор базобого подобъекта нужно так:
class area_cl{
public:
    area_cl(int h, int w) : height(h), width(w){}
    int height;
    int width;
};

class cilinder: public area_cl{
    public:
        cilinder(int h, int w): area_cl(h, w){}
};
Re: Конструктор. Ошибка C2614
От: Bell Россия  
Дата: 28.09.09 09:23
Оценка:
Здравствуйте, zfima, Вы писали:

Z>Здрасте.

Z>Коротко:
Z>почему так можно

...

Z>а так нет???


...

Тоже коротко: по определению.

12.6.2/2
...
Unless the meminitializer-id names a nonstatic data member of the constructor’s class or a direct or virtual base of that
class, the mem-initializer is ill-formed.

Любите книгу — источник знаний (с) М.Горький
Re[2]: Конструктор. Ошибка C2614
От: zfima  
Дата: 28.09.09 09:25
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Здравствуйте, zfima, Вы писали:


Z>>почему так можно


ЮЖ>[...]


Z>>а так нет???


Z>>
Z>>class area_cl{
Z>>public:
Z>>    int height;
Z>>    int width;
Z>>};

Z>>class cilinder: public area_cl{
Z>>public:cilinder(int h, int w): height(h), width(w){}
Z>>};
Z>>


ЮЖ>Вызов конструктора 'cilinder' должен привести к вызову конструктора area_cl, но запись ': height(h), width(w)' никак не может быть таким вызовом (формально, в этом контексте не будут найдены имена height/width).


ЮЖ>Вызывать конструктор базобого подобъекта нужно так:

ЮЖ>
ЮЖ>class area_cl{
ЮЖ>public:
ЮЖ>    area_cl(int h, int w) : height(h), width(w){}
ЮЖ>    int height;
ЮЖ>    int width;
ЮЖ>};

ЮЖ>class cilinder: public area_cl{
ЮЖ>    public:
ЮЖ>        cilinder(int h, int w): area_cl(h, w){}
ЮЖ>};
ЮЖ>

Спасибо Юра!
Re[2]: Конструктор. Ошибка C2614
От: Кодт Россия  
Дата: 28.09.09 10:27
Оценка:
Здравствуйте, Bell, Вы писали:

B>Тоже коротко: по определению.


Вообще-то, полезная фича была бы. При наследовании от POD-структур, например.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[3]: Конструктор. Ошибка C2614
От: Erop Россия  
Дата: 29.09.09 17:08
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Вообще-то, полезная фича была бы. При наследовании от POD-структур, например.


Чем при POD не устраивает потом присвоить?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Конструктор. Ошибка C2614
От: Кодт Россия  
Дата: 29.09.09 22:34
Оценка:
Здравствуйте, Erop, Вы писали:

E>Чем при POD не устраивает потом присвоить?


1) Пропадает видимость декларативности
Кстати, имеет ли право компилятор размещать статические константы типов с очевидными конструкторами в секции констант, как это он делает с агрегатной инициализацией? И если да — то насколько далеко заходит в очевидности?
struct A { int x,y; };
struct B { int x,y; B() : x(1), y(2) {} };
struct C { int x,y; C() { x=1; y=2; } };
struct D { int x,y; D() { x=0; y=2; ++x; } }; // наверно, уже не потянет

A const a = {1,2};
B const b;
C const c;
D const d;


2) Немного иной ход вычислений, из-за чего, скажем, не прокатит вот такое
struct A { ..... };
struct B
{
  B(A* neighbour) { ..... }
};
struct C : A, B
{
  C()
  : A(.....) // если у A есть содержательный конструктор, нам повезло
  , B((A*)this)
  {
    initialize_A(); // иначе B::B до этих данных не доберётся
  }
};

Мысленно подставь на место A(.....) инициализацию отдельных членов (которые нужны для B).
Но последнее, конечно, изврат.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.