Здрасте.
Коротко:
почему так можно
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){}
};
спасибо
Здравствуйте, 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){}
};
Здравствуйте, 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.
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Здравствуйте, 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){}
ЮЖ>};
ЮЖ>
Спасибо Юра!
Здравствуйте, Bell, Вы писали:
B>Тоже коротко: по определению.
Вообще-то, полезная фича была бы. При наследовании от POD-структур, например.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Здравствуйте, Кодт, Вы писали:
К>Вообще-то, полезная фича была бы. При наследовании от POD-структур, например.
Чем при POD не устраивает потом присвоить?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, 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).
Но последнее, конечно, изврат.