Depuis que la classe amitié n'est pas héritée en C ++, quelle est la meilleure façon de "faire semblant"? P>
Je pensais à exposer l'interface privée de la classe d'amis à travers des méthodes protégées dans la classe de base to-héritée, mais cela permet d'écrire (et de maintenir) la même interface deux fois. P>
Y a-t-il d'autres manières? P>
3 Réponses :
L'utilisation d'une clé L'idée est que vous ne pouvez déverrouiller les opérations que si vous avez une clé La question de la clé en cours de copie constructible est à la discussion. Je ne vois pas ce que vous pouvez gagner en l'empêchant. P> Un autre avantage est que vous pouvez avoir plusieurs clés, selon la méthode que vous souhaitez accéder, de cette façon, vous accordez une amitié «partielle» et votre Les amis «partiels» ne peuvent pas gâcher avec vos parties privées, malgré la réclamation célèbre! p> EDIT FORT>: P> Cette méthode est appelée amitié limitée et a été discuté sur comp.lang.c ++. Modéréré . P> L'avantage principal de cette méthode par rapport à interface privée est le couplage lâche, car seules les déclarations avant sont nécessaires. P> P>
Étant donné que clé code> est une classe vide, il dispose-t-il d'un effet de pile-Wize / Memory-Wize, ou le compilateur traite-t-il uniquement comme "Syntaxtic-Sugar"?
Une classe vide «pèse» quelque chose (au moins une valeur d'octets de données, souvent plus de problèmes d'alignement). Il existe une optimisation appelée optimisation de base vide, qui consiste à hériter de la classe vide pour éviter de subir cette surcharge. Vous pouvez donc choisir d'avoir de besoin code> hériter de la clé de
code> et de renvoyer une référence au lieu d'une copie ... mais une référence "pèse aussi quelque chose.
Je ne sais pas si ce n'est pas ce que vous pensez déjà, mais voici un Ami virtuel exemple p>
Les enfants de la classe avec frinetship ont besoin de demander à leur parent de faire l'accès pour eux.
class CrustyNeighbour { private: friend class Bob; void useWiFi(std::string const& data); }; class Bob { protected: useWifi(CrustyNeighbour& neighbour,std::string const& data) { neighbour.useWiFi(data);} }; class Mary: public Bob // Bob's offspring { void playHalo(WifiOwner& owner) // WifiOwner derived from CrustyNeighbour { useWifi(owner,gameData); // use wifi via his/her parent who access to eighbours wifi } };