Pregunta

Desde la amistad clase no se hereda en C ++, ¿cuál es la mejor manera de "falso" que?

Estaba pensando en la exposición de interfaz privada de la clase amigo a través de métodos protegidos en la clase base-a-ser hereditaria, pero que los resultados de tener que escribir (y mantener) la misma interfaz de dos veces.

¿Hay otras maneras?

¿Fue útil?

Solución

El uso de una clave es una posible solución.

La idea es que se puede desbloquear las operaciones sólo si tiene una tecla ... sino un ejemplo vale miles de palabras por lo que vamos a inmersión:

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

El asunto de la clave que se copia es construible a la discusión. No veo lo que se puede obtener mediante la prevención de la misma.

Otra ventaja es que se puede tener varias teclas, dependiendo del método que desea tener acceso, de esta manera le otorga la amistad 'parcial', y sus amigos 'parciales' no puede perder el tiempo con sus partes íntimas, a pesar de la famosa reclamar!

Editar

Este método se llama Limited Amistad, y se examinó en comp.lang.c ++. moderado .

La principal ventaja de este método en comparación con interfaz privada , es la la articulación flexible, ya que sólo hacia adelante declaraciones son necesarias.

Otros consejos

Los hijos de la clase con la amistad no necesitan pedir los padres para hacer el acceso a ellos.

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

No estoy seguro si esto no es lo que ya está pensando pero aquí hay un amigo virtual ejemplo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top