2013-08-06 4 views
1

Dites que j'ai une classe appelée class AI. Et à l'intérieur de cette classe, j'ai créé une autre classe enfant appelée class AIbrain. Maintenant, je veux que chaque objet AI soit capable de faire fonctionner son propre AIbrain. Mais si je class AIbrain{friend AI;}; la classe Aibrain sera exposée à tous les objets de la classe AI.C++: Objets spécifiques aux amis (classes imbriquées)

Donc je me demandais s'il y avait un moyen d'un AIbrain ami leur propre objet AI? Sinon, chaque AI pourra modifier toutes les autres variables de AI et accéder à leurs fonctions.

Répondre

3

J'espère que je vous ai bien compris:

class AI 
{ 
    class AIbrain 
    { 
    } brain; 
}; 

Vous voulez brain pouvoir accéder à son instance de parent AI (exemples de code font beaucoup plus clairement ce que vous voulez atteindre par la voie).

Si tel est le cas, vous pouvez résoudre ce problème en:

class AI 
{ 
     class AIbrain 
     { 
       AI * parent_; 
       explicit AIbrain(AI * parent) : parent_(parent) {} 
     } brain; 

    public: 
     AI() : brain(this) {} 
}; 

Si brain a besoin d'accéder aux membres privés de l'instance mère AI, vous devez toujours déclarer AIbrain comme ami de AI. Puisque AIbrain est un membre de AI, il n'est pas nécessaire de déclarer AI un ami de AIbrain. Notez que ceci est utilisé ici comme une astuce pour empêcher les utilisateurs d'instancier directement AIbrain (le constructeur privé n'est accessible que pour AI).

2

Vous ne modifiez pas les variables et les fonctions d'une classe (à moins qu'elles ne soient statiques) vous modifiez celles d'une instance.
Si vous voulez simplement chaque AI-ont unAIBrain, donner à chaque instance AI membre AI

class AIBrain { /*...*/ }; 
class AI { 
    public: 
    //whatever 
    private: 
    AIBrain brain; 
}; 

Chaque instance AI a alors son propre cerveau et peuvent utiliser les membres et les fonctions publiques du cerveau.

Questions connexes