2014-05-01 1 views
0

Voici ce que je suis en train de faire:C++ permettent dérivé classes d'ami d'avoir accès à la classe imbriquée privée

class A 
{ 
    friend class C (and all of C's derived classes) 
public: 
    void DoAThing() { mpMyC->DelegateResponsibility(myB); } 

private: 
    class B 
    { 
    }; 
    B mMyB; 
    C* mpMyC; 
}; 

class C 
{ 
    // No problem here- C can see B 
    virtual void DelegateResponsibility(const A::B& necessaryInfo); 
}; 

class D: public C 
{ 
    // Uh-oh- we don't inherit friendship 
    virtual void DelegateResonsibility(const A::B& necessaryInfo); 
}; 

En bref, j'ai une classe imbriquée privée à l'intérieur A, car il est un détail de mise en œuvre de Cependant, j'aimerais déléguer certaines responsabilités de A aux classes dérivées de C et C pour obtenir un comportement polymorphe. Je souhaite éviter d'ajouter une ligne de classe d'amis chaque fois que quelqu'un dérive de C. La solution de contournement standard donnée pour les classes d'amis dérivées est "ajouter une fonction accesseur protégée à votre classe de base et la remplacer pour les membres dérivés". aide à accéder aux membres privés de la classe A, et non aux classes à portée privée. Existe-t-il un moyen de contourner ce problème?

Répondre

1

cela devrait fonctionner:

class C 
{ 
    typedef A::B MyB; 
    virtual void DelegateResponsibility(const MyB& necessaryInfo); 
}; 

class D: public C 
{ 
    // Uh-oh- we don't inherit friendship 
    virtual void DelegateResonsibility(const MyB& necessaryInfo); 
}; 
+0

Hourra! Merci - cela a fonctionné. – dbromberg

+0

Cela ne fonctionnera pas exactement comme vous l'avez écrit: par défaut 'MyB' sera un membre privé de' C'. – dyp

0

Vous pouvez placer votre classe B dans un espace de nom de détail, à la portée du fichier.

quelque chose comme ceci:

namespace my_hidden_area { 
    class B { 
     ... 
    } 
} 

Ce n'est pas aussi forte protection que faire la classe imbriquée privée, bien sûr, mais il faut préciser aux étrangers qu'ils ne devraient pas être déconner avec B.

Si vous vous demandez pourquoi l'amitié n'est pas héritable, voir cette question: Why does C++ not allow inherited friendship?

Questions connexes