2015-03-10 9 views
1

я следующая ситуация, я объявил const член суперкласса и теперь я хочу, чтобы инициализировать его в конструкторе одного из его подклассов используя список инициализатору.Как инициализировать переменную const-члена суперкласса в конструкторе подкласса в C++?

struct Shape { 
public: 
    const Rect boundingRect; // the rect in which the shape is contained 
}; 

struct Stain : Shape 
{ 
public: 
    Stain(Rect boundingRect_) : boundingRect(boundingRect_) {} 
}; 

Я не уверен, если это вообще возможно, если взять простой подход, показанный выше, компилятор жалуется следующее сообщение:

member initializer 'boundingRect' does not name a non-static data member or base class 

This answer объясняет, почему это не возможно, чтобы инициализировать элемент переменные суперкласса в список инициаторов. Мне интересно, какая лучшая практика может быть для этой ситуации?

ответ

3

Вам нужно будет добавить конструктор для struct Shape и вызвать его из вашего подкласса. Нравится так:

struct Shape { 
public: 
    const Rect boundingRect; // the rect in which the shape is contained 

    Shape(Rect rect) : boundingRecT(rect) {} 
}; 

struct Stain : Shape 
{ 
public: 
    Stain(Rect boundingRect_) : Shape (boundingRect_) {} 
}; 
2

Здесь вы можете инициализировать только переменные-члены класса и базовые классы (а не элементы базового класса).

Решение дать Shape конструктор, который принимает инициализатор, например:

Shape(Rect rect): boundingRect(rect) {} 

и Stain вызывающую это так:

Stain(Rect boundingRect_): Shape(boundingRect_) {} 

Если вы не хотите широкой общественности с помощью этот конструктор вы можете сделать это protected:.

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

  • Нет связанных вопросов^_^