2017-08-07 1 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 
    } 
} 

In dem obigen Code, erhalte ich Fehler beim Zugriff auf und Objekte der Struktur zu schaffen, die unter dem private Spezifizierer in der base Klasse.C++ Zugriff auf Private Struktur der Base in derive Klasse

Bitte sagen Sie mir, warum ich in der Lage bin, eine Strukturvariable direkt, aber nicht mit dem Klassenobjekt base in der abgeleiteten Klasse zu erstellen.

+0

Welchen Compiler benutzen Sie? [Clang lehnt den Code mit einem erwarteten Fehler ab] (http://coliru.stacked-crooked.com/a/2917984eabedbf68). – StoryTeller

+0

Ich benutzte einen Web-basierten Compiler von http://cpp.sh/ Die URL für meinen Code ist cpp.sh/4zfre/ – Nripendra

+1

Es wird auf der Website cpp.sh erwähnt, dass das System GCC 4.9.2, mit Boost verwendet 1.55 verfügbar ' – Nripendra

Antwort

0

Sie deklarieren privaten Typ: struk1 in der Basisklasse. Dies bedeutet, dass auf diesen Typ nur in der Basisklasse zugegriffen werden kann. Dann deklarieren Sie private Instanz s1 dieses Typs.

Ich bin überrascht, dass Ihr Compiler hier nicht beschweren:

struct struk1 s2; // Works Fine 

Sie deklarieren Beispiel s2 vom Typ struk1, die privat ist, so abgeleitete Klasse keinen Zugang zu ihm hat. Der VS2013-Compiler sagt nicht, dass es funktioniert.

Wie oben beziehen Sie sich auf den Typ base :: struq1, der privat ist. Dies sind interne Klassendetails, die in der Basisklasse gekapselt sind.

Möchten Sie, dass abgeleitete Klassen Zugriff darauf haben, deklarieren Sie strukr1 als geschützt. Wenn Sie möchten, dass sich jeder auf diesen Typ als Basis :: struK1 bezieht, machen Sie es öffentlich.

In abgeleiteten Klasse Sie s2 Instanz erklärt haben, also kein Problem sein a1 Feldes über in abgeleiteten Klasse des Zugriff auf (unter der Annahme, dass Sie struk1 Typen zumindest geschützt in Basisklasse gemacht:

s1.a1 = x; 

Hier kommen wir zu diesem line:.

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

Sie in abgeleiteten Klasse b1 Instanz von Basistyp deklariert Sie versuchen, zu seinem privaten Instanz s1 für den Zugriff auf private bedeutet es innerhalb der Klasse sichtbar ist es deklariert ist, also kein Wunder, dass Sie keinen Zugriff haben. es äußerlich, es ist egal, dass Sie die Basis b1 deklariert haben Instanz innerhalb der abgeleiteten Klasse, versuchen Sie, b1 private Interna zu ändern, was nicht erlaubt ist. Es geschützt zu machen, hilft nicht. Sie müssen es öffentlich machen, wenn Sie b1.s1.a1 = x;

+0

Vielen Dank für Ihre Antwort. Das Problem ist mit Compiler, den ich verwendet habe, um diesen Code zu kompilieren. Ich benutzte einen Online-Compiler von cpp.sh, der mir das obige Ergebnis gab. Aber nachdem ich mir die Kommentare angeschaut habe, habe ich den Code mit dem Code Block erstellt und das Ergebnis war wie erwartet. Diese Zeile der Code-Struktur struk1 s2; was funktionierte gut auf cpp.sh Compiler zeigte Fehler auf Codeblock – Nripendra

0

Auf private Datenmitglieder kann nur innerhalb der Klasse zugegriffen werden, in der sie deklariert sind. Machen Sie sie entweder öffentlich oder geschützt, wenn Sie auf sie in Ihren abgeleiteten Klassen zugreifen möchten.

Verwandte Themen