Maison > développement back-end > C++ > Les classes internes en C peuvent-elles accéder aux membres privés de leur classe externe ?

Les classes internes en C peuvent-elles accéder aux membres privés de leur classe externe ?

Patricia Arquette
Libérer: 2024-11-27 13:36:13
original
405 Les gens l'ont consulté

Can Inner Classes in C   Access Private Members of Their Outer Class?

Les classes internes peuvent-elles accéder aux variables privées ?

Dans cet exemple de code, une classe interne, Inner, est définie au sein d'une classe externe, Outer . Lorsqu'une instance de Inner est créée, elle est censée avoir accès à la variable membre privée var de la classe Outer. Cependant, une fois compilé, une erreur se produit, indiquant qu'Inner n'a aucun membre nommé var.

Classes internes et accès aux membres

Une classe interne en C est considérée comme un ami de sa classe extérieure. En tant qu'ami, une classe interne a accès à tous les membres de la classe externe, y compris les membres privés. Par conséquent, les instances de Inner devraient pouvoir accéder à la variable privée var de Outer.

Le problème et la solution

L'erreur provient de l'absence de connexion entre instances de Inner et instances de Outer. En Java, il existe une relation parent-enfant implicite entre les classes internes et leurs classes englobantes. Cependant, en C , cette relation doit être explicitement définie.

Pour résoudre le problème, une référence à la classe externe doit être transmise au constructeur de la classe interne. Cela fournit à la classe interne le contexte nécessaire pour accéder aux membres de la classe externe.

Voici un exemple qui montre comment établir la connexion parent-enfant et permettre à Inner d'accéder à la variable privée var de Outer :

#include <string>
#include <iostream>

class Outer {
public:
    class Inner {
    public:
        Inner(Outer& x): parent(x) {}  // Pass a reference to the outer class

        void func() {
            std::string a = "myconst1";
            std::cout << parent.var << std::endl;

            if (a == Outer::MYCONST)
                std::cout << "string same" << std::endl;
            else
                std::cout << "string not same" << std::endl;
        }

    private:
        Outer& parent;
    };

    public:
        Outer(): i(*this), var(4) {}
        Outer(Outer& other): i(other), var(22) {}
        void func() {
            i.func();
        }

    private:
        static const char* const MYCONST;
        Inner i;
        int var;
};

const char* const Outer::MYCONST = "myconst";

int main() {
    Outer o1;
    Outer o2(o1);
    o1.func();
    o2.func();

    return 0;
}
Copier après la connexion

Ce code révisé permet à Inner d'accéder à var car le constructeur d'Inner établit une relation parent-enfant entre Inner et l'instance Outer qui l'a créé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal