2017-08-07 4 views
0
class base 
{ 
    struct struk1 
    { 
     int a1; 
    }; 

    struct struk1 s1; 

public: 

    base(int x) 
    {    
     s1.a1 = x;   
    } 

    base() {} 
}; 

class b : public base 
{ 
    struct struk1 s2; // Works Fine  
    base::struk1 s3; // Error is given => 'struct base::struk1' is private 
    base b1; 

public:  
    b(int x, int y) : base(y) 
    {  
     s2.a1 = x; // Works Fine 
     b1.s1.a1 = x; // Error => 'base::struk1 base::s1' is private 
    } 
} 

Dans le code ci-dessus, je me fais des erreurs lors de l'accès et la création d'objets de la structure qui est sous le spécificateur private dans la classe base.C++ Accès structure privée de la base en classe derive

Veuillez me dire pourquoi je peux créer une variable de structure directement, mais pas en utilisant l'objet de classe base dans la classe dérivée.

+0

Quel compilateur utilisez-vous? [Clang rejette votre code avec une erreur attendue] (http://coliru.stacked-crooked.com/a/2917984eabedbf68). – StoryTeller

+0

J'ai utilisé un compilateur basé sur le Web de http://cpp.sh/ L'URL pour mon code est cpp.sh/4zfre/ – Nripendra

+1

Il est mentionné sur le site cpp.sh que 'Le système utilise GCC 4.9.2, avec Boost 1.55 disponible ' – Nripendra

Répondre

0

Vous déclarez le type privé: struk1 dans la classe de base. Cela signifie que ce type ne sera accessible que dans la classe de base. Ensuite, vous déclarez l'instance privée s1 de ce type.

Je suis surpris que votre compilateur ne se plaint pas ici:

struct struk1 s2; // Works Fine 

Vous déclarez par exemple s2 de type struk1, qui est privé, la classe ainsi obtenue n'a pas accès. VS2013 compilateur ne dit pas que cela fonctionne.

Comme précédemment, vous faites référence au type base :: struk1 qui est privé. Ce sont des détails de classe internes, qui sont encapsulés dans la classe de base.

base::struk1 s3; // Error is given => 'struct base::struk1' is private 

Voulez-vous que les classes dérivées y aient accès, déclarez le type struk1 comme protégé. Si vous voulez que tout le monde puisse se référer à ce type en tant que base :: struk1, rendez-le public.

En classe dérivée, vous avez déclaré exemple s2, donc pas de problème pour accéder à son champ A1 via la classe dérivée (en supposant que vous avez fait le type de struk1 au moins protégé dans la classe de base:

s1.a1 = x; 

Ici, nous arrivons à cette ligne:.

b1.s1.a1 = x; // Error => 'base::struk1 base::s1' is private 

vous avez déclaré exemple b1 du type de base en classe dérivée vous essayez d'accéder à son instance privée s1 signifie privé est visible au sein de la classe, il est déclaré, donc pas étonnant que vous ne pouvez pas accéder. à l'extérieur, peu importe que vous soyez déclaré base b1 instance dans la classe dérivée, vous essayez de modifier b1 private internals, ce qui n'est pas autorisé. Le faire protéger n'aide pas. Vous devez le rendre public si vous voulez faire b1.s1.a1 = x;

+0

Merci pour votre réponse. Le problème est avec le compilateur que j'ai utilisé pour compiler ce code. J'ai utilisé un compilateur en ligne de cpp.sh qui m'a donné le résultat ci-dessus. Mais après avoir regardé les commentaires que j'ai compilés, je gagne en utilisant Code Block et le résultat était comme prévu. Cette ligne de code struct struk1 s2; qui fonctionnait bien sur le compilateur cpp.sh a montré une erreur sur le bloc de code – Nripendra

0

Les membres de données privées sont accessibles uniquement dans la classe dans laquelle ils sont déclarés. Rendez-les publics ou protégés si vous souhaitez y accéder dans vos classes dérivées.