Une classe interne est un ami de la classe dans laquelle elle est définie.
Donc oui; un objet de type Outer::Inner
peut accéder à la variable membre var
d'un objet de type Outer
.
Contrairement à Java, il n'y a pas de corrélation entre un objet de type Outer::Inner
et un objet de la classe parent. Vous devez créer la relation parent-enfant manuellement.
#include <string>
#include <iostream>
class Outer
{
class Inner
{
public:
Inner(Outer& x): parent(x) {}
void func()
{
std::string a = "myconst1";
std::cout << parent.var << std::endl;
if (a == 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();
}
Une classe interne a accès à tous les membres de la classe externe, mais elle n'a pas de référence implicite à une instance de classe parente (contrairement à certaines bizarreries avec Java). Donc, si vous transmettez une référence à la classe externe à la classe interne, elle peut référencer n'importe quoi dans l'instance de classe externe.
la source
Tout ce qui fait partie d'Outer doit avoir accès à tous les membres d'Outer, publics ou privés.
Edit: votre compilateur est correct, var n'est pas membre d'Inner. Mais si vous avez une référence ou un pointeur vers une instance d'Outer, il pourrait y accéder.
la source
var n'est pas membre de la classe interne.
Pour accéder à var, un pointeur ou une référence à une instance de classe externe doit être utilisé. par exemple pOuter-> var fonctionnera si la classe interne est un ami de external, ou, var est public, si l'on suit strictement le standard C ++.
Certains compilateurs traitent les classes internes comme l'ami de l'extérieur, mais d'autres non. Voir ce document pour le compilateur IBM :
"Une classe imbriquée est déclarée dans la portée d'une autre classe. Le nom d'une classe imbriquée est local par rapport à sa classe englobante. À moins que vous n'utilisiez des pointeurs, des références ou des noms d'objet explicites, les déclarations d'une classe imbriquée ne peuvent utiliser que des constructions visibles, y compris noms de type, membres statiques et énumérateurs de la classe englobante et des variables globales.
Les fonctions membres d'une classe imbriquée suivent les règles d'accès normales et n'ont pas de privilèges d'accès spéciaux aux membres de leurs classes englobantes. Les fonctions membres de la classe englobante n'ont pas d'accès spécial aux membres d'une classe imbriquée. "
la source
friend
oupublic
. Qui se soucie si IBM avait tort / dépassé, dans le passé, à un lien mort? Cette réponse était déjà obsolète 3 ans avant sa publication.Tout d'abord, vous essayez d'accéder à un membre non statique en
var
dehors de la classe, ce qui n'est pas autorisé en C ++.La réponse de Mark est correcte.
Vous pouvez donc faire deux choses, soit déclarer en
var
tant questatic
ou utiliser une référence d'une instance de la classe externe pour accéder à 'var' (car une classe ou une fonction également besoin d'une référence pour accéder aux données privées).Var statique
Remplacez
var
parstatic
Si vous ne souhaitezvar
pas être associé aux instances de la classe.Sortie- var: 1
Var non statique
La référence d'un objet doit accéder à toutes les variables membres non statiques.
Sortie- var: 1
Modifier - Les liens externes sont des liens vers mon blog.
la source