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

Comment les classes internes en C peuvent-elles accéder aux membres privés de leur classe englobante ?

Patricia Arquette
Libérer: 2024-12-08 06:51:14
original
240 Les gens l'ont consulté

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

Classes internes accédant aux variables privées en C

En C, les classes internes ont la capacité unique d'accéder aux membres privés de la classe englobante. Prenons l'exemple suivant :

class Outer {

    class Inner {
    public:
        Inner() {}
        void func();
    };

private:
    static const char* const MYCONST;
    int var;
};
Copier après la connexion

Dans cet exemple, la classe Inner est définie au sein de la classe Outer. Selon les règles de portée traditionnelles, la variable membre var de Outer ne doit pas être accessible à Inner. Cependant, en C , les classes internes sont intrinsèquement amies de leur classe englobante.

Par conséquent, les objets de type Outer::Inner peuvent accéder aux variables membres privées de Outer. Cependant, il est important de noter que cet accès n'est accordé que dans le cadre de la classe interne.

Pour illustrer davantage ce concept, modifions la méthode func() de la classe Inner comme suit :

void Outer::Inner::func() {
    var = 1;
}
Copier après la connexion

Maintenant, si nous essayons de compiler ce code, nous rencontrerons un message d'erreur indiquant que 'class Outer::Inner' n'a aucun membre nommé 'var'. En effet, même si les classes internes ont accès aux membres privés, elles n'héritent pas d'une relation de membre avec la classe englobante.

Pour établir une relation de membre appropriée au sein de la classe interne, nous devons créer manuellement une référence à la classe interne. classe englobante, comme le montre l'exemple suivant :

class Outer
{
    class Inner
    {
        public:
            Inner(Outer& x): parent(x) {}
            void func()
            {
                std::cout << parent.var << std::endl;
            }
        private:
            Outer& parent;
    };

    public:
        Outer() : i(*this), var(4) {}
        void func()
        {
            i.func();
        }
    private:
        Inner i;
        int var;
};

int main()
{
    Outer o;
    o.func();
}
Copier après la connexion

Dans cet exemple, le constructeur de classe Inner prend une référence à la classe Outer comme argument. Cela permet aux objets de type Outer::Inner d'accéder aux membres privés d'Outer via la référence parent.

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