Question

Depuis l'amitié de classe n'est pas hérité en C ++, ce qui est la meilleure façon de « faux » il?

Je pensais à exposer l'interface privée de classe amis grâce à des méthodes protégées dans la classe de base à être héritée, mais que les résultats en avoir à écrire (et maintenir) la même interface deux fois.

Y at-il d'autres moyens?

Était-ce utile?

La solution

L'utilisation d'un touche est une solution possible.

L'idée est que vous pouvez déverrouiller les opérations que si vous avez un touche ... mais un exemple vaut des milliers de mots alors laissez-plongée de:

// Step 1: The key
class NeedAccess;

namespace details { class Key { friend NeedAccess; Key() {} }; }

// Step 2: NeedAccess
class NeedAccess
{
protected:
  static details::Key GetKey() { return details::Key(); }
};

// Step 3: The big one
class BigOne
{
public:
  void lockedMethod(details::Key);
};

La question de la clé étant la copie est à constructible discussion. Je ne vois pas ce que vous pouvez gagner en empêchant.

Un autre avantage est que vous pouvez avoir plusieurs clés, en fonction de la méthode que vous souhaitez accéder, de cette façon vous accorder l'amitié « partielle » et vos amis « partielle » ne peut pas déranger avec vos parties intimes, en dépit de la célèbre réclamer!

EDIT :

Cette méthode est appelée limitée Amitié, et a été discuté sur comp.lang.c ++. modéré.

Le principal avantage de cette méthode par rapport à interface privée, est le couplage lâche, étant donné que les déclarations sont nécessaires avant.

Autres conseils

Les enfants de la classe avec amitié doivent y demander des parents 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
     }
};

Je ne sais pas si ce n'est pas ce que vous êtes déjà penser à, mais voici une

scroll top