2013-05-29 1 views
1

это мой первый вопрос здесь :) я есть я немного проблема .. это мои классы:не может получить доступ к закрытому члену, объявленный в классе

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

У меня также есть функция мультиплеера, где я стараюсь tu use с аргументом:

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' 
+0

Ну, вы не можете получить доступ к закрытому члену 'znak_gracza', объявленному в классе' Gracz'. Это личное. –

+0

Недостатком части этой головоломки может быть то, что члены 'class' являются' private', если не объявлены иначе, как в случае с 'char znak_gracza' –

+0

' znak_gracza' является частным членом, поэтому он не доступен в производном классе –

ответ

1

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

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

};

5

private доступ к члену доступен только для членов класса, и друзей. что вы ищете, чтобы объявить char znak_gracza как protected, поэтому классы, наследующие Gracz, также имеют доступ к этому члену.

вашего класс Грач должен выглядеть следующим образом:

class Gracz{ 
protected: 
    char znak_gracza; 
public: 
    Gracz(); 
    Gracz(char znak){ 
      this->znak_gracza = znak; 
     }; 
    friend void multiplayer(); 
}; 
+1

Не лучше ли делегировать базовому конструктору? –

0

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

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

5

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

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