2009-10-22 15 views
12

Voglio fare una classe di classe A di classe B. Voglio farlo perché questi interagiscono molto e A ha bisogno di cambiare interni di classe B (che non voglio esporre usando pubblico) . Ma voglio assicurarmi che abbia accesso solo a poche funzioni selezionate, non a tutte le funzioni.classe di amici con accesso limitato

Esempio:

class A 
{ 
}; 

class B 
{ 
private: 
void setState(); 
void setFlags(); 
friend class A 
}; 

voglio una di essere in grado di accedere setState ma non SetFlags ... C'è un modello di progettazione o un bel modo di fare questo o sono io lasciato con che dà accesso completo o no accesso a tutti in questo caso.

Grazie

+0

A parte il fatto che potresti personalizzare il tuo account (ci sono così tanti sconosciuti ...), questa è davvero una domanda molto interessante. Al momento sto ancora giocando con la chiave e l'interfaccia privata! –

risposta

26

Dipende da cosa si intende per "un bel modo" :) A comp.lang.C++. Moderato abbiamo avuto la stessa domanda qualche tempo fa. Si può vedere la discussione che ha generato there.

IIRC, abbiamo finito con l'approccio "amico di una chiave annidata". Applicato al tuo esempio, questo sarebbe resa:

class A 
{ 
}; 

class B 
{ 
public: 
    class Key{ 
     friend class A; 
     Key(); 
    }; 

    void setFlags(Key){setFlags();}   

private: 
    void setState(); 
    void setFlags(); 
}; 

L'idea è che le SetFlags pubblici() deve essere richiamato con una "chiave", e solo gli amici di Key in grado di creare uno, come il suo ctor è privato.

+0

+1: non l'ho mai visto prima, davvero molto intelligente. –

+0

Davvero intelligente. Di solito mi affidavo a un "contratto" poiché non avevo combattuto in alcun modo per questo ... impari ogni giorno! –

+0

A proposito, nella domanda OP, voleva accedere a setState, non setFlags ... sì, sono pedante ... –

7

Un approccio è attraverso interfacce esplicite, perché l'implementor di un'interfaccia può scegliere chi li danno a:

class NearlyPrivateInterface { 
public: 
    virtual void setState() = 0; 
    virtual void setFlags() = 0; 
}; 

class A { 
public: 
    void attach(NearlyPrivateInterface* instanceOfB); 
}; 

class B: private NearlyPrivateInterface { 
public: 
    void attach(A& a) { a.attach(this); } 
}; 
+1

Che il modello dell'interfaccia privata: http://www.objectmentor.com/resources/articles/privateInterface.pdf –

2

Si può fare in seguito cosa ..

class A{ 
}; 

class B{ 
private: 
    void setFlags(); 
protected: 
    void setState(); 

}; 

class RestrictedB :public B{ 
    friend class A; 
}; 
Problemi correlati