это мой первый вопрос здесь 🙂
у меня есть маленькая проблема ..
это мои занятия:
class Gracz{
char znak_gracza;
public:
Gracz();
Gracz(char znak){
this->znak_gracza = znak;
};
friend void multiplayer();
};
class Osoba: public Gracz{
public:
Osoba();
Osoba(char znak){
this->znak_gracza = znak;
};
friend void multiplayer();
};
У меня также есть функция мультиплеера, где я пытаюсь использовать конструктор с аргументом:
void multiplayer(){
Osoba gracz1('O');
Osoba gracz2('X');
...
}
но это не работает
ошибки одинаковы для gracz1
а также gracz2
error C2248: 'Gracz::znak_gracza' : cannot access private member declared in class 'Gracz'
see declaration of 'Gracz::znak_gracza'
see declaration of 'Gracz'
Конструктор должен передать параметр конструктору базового класса:
class Osoba: public Gracz{
public:
//...
Osoba(char znak) :
Gracz(znak) {
}
};
Производные классы не могут получить доступ к закрытым членам родительского класса. Вы можете объявить их как protected
(который похож на приватный, но позволяет производным классам обращаться к нему), но в вашем случае, так как Gracz
обеспечивает способ инициализации переменной, вы должны просто позволить Osoba
передать аргумент Gracz
конструктор.
Osoba(char znak)
: Gracz(znak) // initializes parent class
{}
private
членский доступ доступен только для участников класса и друзей. что вы ищете, чтобы объявить char znak_gracza
как protected
так что классы которые наследуют Gracz
иметь доступ к этому члену, а также.
ваш класс Gracz должен выглядеть примерно так:
class Gracz{
protected:
char znak_gracza;
public:
Gracz();
Gracz(char znak){
this->znak_gracza = znak;
};
friend void multiplayer();
};
multiplayer
функция является другом Gracz
класс, но Osoba
класс не
Помните, что дочерние классы не могут автоматически обращаться к родительским классам частный переменные. Если ты хочешь Osoba
чтобы получить доступ к znak_gracza
переменная вы должны сделать это protected
,