La fonction membre de classe imbriquée ne peut pas accéder à la fonction de la classe englobante. Pourquoi?
Voir l'exemple de code ci-dessous:
class A
{
private:
class B
{
public:
foobar();
};
public:
foo();
bar();
};
Au sein de la classe A & B mise en œuvre:
A::foo()
{
//do something
}
A::bar()
{
//some code
foo();
//more code
}
A::B::foobar()
{
//some code
foo(); //<<compiler doesn't like this
}
Les drapeaux du compilateur l'appel à foo() dans la méthode foobar(). Plus tôt, j'avais foo() comme fonction membre privée de la classe A, mais il a changé de public en supposant que B est la fonction ne peut pas le voir. Bien sûr, il n'a pas aidé. Je suis en train de ré-utiliser la fonctionnalité fournie par Une méthode. Pourquoi ne pas le compilateur permettre à cet appel de fonction? Comme je le vois, ils font partie de la même classe englobante (Un). J'ai pensé que le problème de l'accessibilité pour la classe imbriquée meebers pour la classe englobante dans les normes C++ a été résolu.
Comment puis-je obtenir ce que je suis en train de faire sans avoir à ré-écrire la même méthode (foo()) pour B, qui, B imbriquée à l'intérieur d'Un?
J'utilise VC++ compilateur ver-9 (Visual Studio 2008). Je vous remercie pour votre aide.
source d'informationauteur Rahul
Vous devez vous connecter pour publier un commentaire.
foo()
est un non-membre statique de la fonction deA
et vous essayez de l'appeler sans une instance.La classe imbriquée
B
est une salle de classe qui n'a que quelques privilèges d'accès et ne nécessite aucune connaissance particulière sur les instances existantes deA
.Si
B
besoin d'accéder à unA
vous donner une référence, par exemple:C'est un automagic, mais éventuellement non-compatibles truc (qui a travaillé sur VC++ depuis 6.0). Classe B doit être un membre de la classe A pour que cela fonctionne.
Si vous souhaitez réutiliser les fonctionnalités à partir d'Une puis vous devrait hériter d'Un pas de nid B à l'intérieur.
Fondamentalement, ce que Georg Fritzsche dit
Si vous supprimez la valeur par défaut B constructeur, vous obtiendrez une erreur