Pergunta

Desde amizade classe não é herdada em C ++, o que é a melhor maneira de "fake" ele?

Eu estava pensando em expor interface privada do amigo de classe através de métodos protegidos na base de classe a-ser-hereditária, mas que resulta em ter que escrever (e manter) a mesma interface duas vezes.

Existem outras maneiras?

Foi útil?

Solução

O uso de um tecla é uma solução possível.

A idéia é que você pode desbloquear as operações somente se você tem um tecla ... mas um exemplo vale milhares de palavras de modo mergulho Vamos:

// 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);
};

A questão da chave construível ser cópia é até discussão. Eu não ver o que você pode ganhar, impedindo-o.

Outra vantagem é que você pode ter várias chaves, dependendo de qual método você deseja acessar, desta forma você conceder amizade 'parcial', e seus amigos 'parciais' não pode mexer com suas partes íntimas, apesar da famosa reivindicação!

Editar :

Este método é chamado limitada Amizade, e foi discutido em comp.lang.c ++. moderado .

A principal vantagem deste método em comparação com interface privada , é a acoplamento fraco, uma vez que apenas declarações para a frente são necessários.

Outras dicas

As crianças da classe com necessidade amizade pedir há pai para fazer o acesso para eles.

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
     }
};

Não sei se isso não é o que você já está pensando, mas aqui está um Virtual amigo exemplo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top