2016-05-03 1 views
-3

Есть ли способ установить частную переменную-член базового класса на значение в конструкторе производного класса?Может ли переменная-член частного базового класса быть модифицирована в производном классе?

Я понимаю, что для этого нужны методы getter и setter, и что делает переменную защищенной или общедоступной, но если вы не можете изменить базовый класс, есть ли альтернативный способ ее установить?

+1

Зачем вам это нужно? – GManNickG

+0

Если у вас нет контроля над базовым классом, это действительно плохая идея. Вы настраиваете себя на неработающий код в непредсказуемое время в будущем, даже если вы не создаете неопределенное поведение прямо сейчас - что вы в основном. – Galik

+0

_ "но если вы не можете изменить базовый класс, есть ли альтернативный способ его установить?" _ Обычно нет, но ваш базовый класс предоставляет конструктор, который инициализирует переменные частного члена? –

ответ

5

№ Это личное. В этом весь смысл private.

Из пояснений в комментариях - базовый класс дает вам способ сделать это через свой конструктор, чтобы вы могли его использовать.

// Assuming MyBaseclass has a 1 int constructor to set the 
// private member, then something like this works. 
// 
MySubclass(int x) : MyBaseclass(x) {} 
+0

Ответ получается [путь проще] (http: // stackoverflow.com/questions/36994671/can-a-private-base-class-member-variable-be-modified-in-a-производный класс # comment61543368_36994671), но вопрос на первом месте. –

-1

Нет, вы не можете. Тем не менее, вы можете сделать производный класс friend базового класса (в этом случае это не так хорошо) или сделать член private членом protected (который доступен только для базового класса и производных классов).

Я бы рекомендовал второе предложение в этом случае, чтобы не давать каждому члену private вашему производному классу. Однако, как правило, вы должны получить доступ к базовому классу через свой интерфейс, но это действительно зависит от вашего дизайна.

Редактировать: Если это в конструкторе, вы должны поступать по-другому. См. Другие ответы.

+0

Ответ оказывается [проще] (http://stackoverflow.com/questions/36994671/can-a-private-base-class-member-variable-be-modified-in-a-derived-class#comment61543368_36994671) , но вопрос на первом месте. –

0

Я понимаю, что для этого нужны методы getter и setter, и что делает переменную защищенной или общедоступной, но если вы не можете изменить базовый класс, есть ли альтернативный способ его установить?

Конечно. Альтернативный способ вместо того, чтобы использовать функции сеттера в производном теле конструктора класса, чтобы использовать соответствующий конструктор из вашего производного класса вызвать инициализирующий конструктор базового класса (как вы утверждаете, что существует в вашем comment):

class Base { 
public: 
    Base(int x, int y) : x_(x), y_(y) {} 
private: 
    int x_; 
    int y_; 
}; 

class Derived : public Base { 
public: 
    Derived() : Base(15,42) {} 
      // ^^^^^^^^^^^^^ 
}: 

Подробнее о member initializer list.