не может получить доступ к приватному члену, объявленному в классе

это мой первый вопрос здесь 🙂
у меня есть маленькая проблема ..
это мои занятия:

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'

1

Решение

Конструктор должен передать параметр конструктору базового класса:

class Osoba: public Gracz{
public:
//...
Osoba(char znak) :
Gracz(znak) {
}

};

2

Другие решения

Производные классы не могут получить доступ к закрытым членам родительского класса. Вы можете объявить их как protected (который похож на приватный, но позволяет производным классам обращаться к нему), но в вашем случае, так как Gracz обеспечивает способ инициализации переменной, вы должны просто позволить Osoba передать аргумент Gracz конструктор.

Osoba(char znak)
: Gracz(znak) // initializes parent class
{}
6

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();
};
5

multiplayer функция является другом Gracz класс, но Osoba класс не

Помните, что дочерние классы не могут автоматически обращаться к родительским классам частный переменные. Если ты хочешь Osoba чтобы получить доступ к znak_gracza переменная вы должны сделать это protected,

0