2013-06-19 2 views
2

Я очищаю свои знания по C++ и пытаюсь написать здесь программу.Инициализировать защищенные элементы данных из конструктора производного класса

class Quad{ 
public: 
Quad(){} 
protected: 
vec _topLeft, _topRight, _bottomLeft, _bottomRight; 
}; 

class IrregularQuad : public Quad{ 
public: 
IrregularQuad(vec topLeft, vec topRight, vec bottomLeft, vec bottomRight) 
: _topLeft(topLeft), _topRight(topRight), _bottomLeft(bottomLeft), _bottomRight(bottomRight) 
{} 
}; 

Я получаю ошибку компиляции на выше Dervied класса подрядчика говоря: инициализатора Члена _topLeft не называет нестатический memeber данных или базовый класс (аналогичные ошибки для других членов, а)

Я не могу понять, что происходит. Неужели я не могу инициализировать защищенных членов, используя список Initalizer или что-то еще?

+0

Что такое 'vec'? –

+0

'vec' - еще один класс, который я определил для векторов (x, y, z) – user1240679

+1

Возможный дубликат [Проблема с доступом к базовому члену в производном конструкторе] (http://stackoverflow.com/questions/2947583/problema-accessing-base -member-in-производный-конструктор) –

ответ

3

Является ли это тем, что я не могу инициализировать защищенные члены, используя список Initalizer или что-то еще?

Право. Только собственные члены класса могут быть инициализированы в списке инициализаторов конструктора (вы можете, OTOH, назначить их в теле конструктора). Сначала базовые подобъекты инициализируются.

Вам нужно как-то делегировать эту работу одной из конструкторов базового класса:

class Base { 

    explicit Base(int i) : m(i) 
    {} 
protected: 
    int m; 
}; 

class Derived : public Base { 
    explicit Derived(int i) : Base(i) 
    { } 
}; 
+0

«Явный» означает? – user1240679

+0

Он останавливает неявные отбрасывания от int. В противном случае вы можете написать Base b = 42; См. Http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean/121163#121163 – doctorlove

+0

Он предотвращает неявное преобразование из int в 'Base', например:' Base b = 1; // не будет работать. Но это делает: 'Base b = Base (1); // работает, это явно. Хорошая практика - объявить конструкторы аргументов как явные по этой причине. – jrok

1

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

+0

Поскольку члены защищены, я думал, что это можно сделать так (используя список инициализаторов в производном классе). – user1240679

Смежные вопросы

 Смежные вопросы