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

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

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'

4 ответа

Решение

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

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,

Другие вопросы по тегам