2009-10-22 24 views
12

Chcę stworzyć klasę klasy przyjaciela klasy B. Chcę to zrobić, ponieważ te oddziałują bardzo intensywnie i A potrzebuje zmienić wewnętrzne klasy B (którego nie chcę ujawniać za pomocą publicznych) . Ale chcę się upewnić, że ma dostęp tylko do kilku wybranych funkcji, a nie do wszystkich funkcji.klasa przyjaciela z ograniczonym dostępem

Przykład:

class A 
{ 
}; 

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

chcę, aby mieć dostęp do setState ale nie setFlags ... Czy istnieje wzorzec projektowania lub dobry sposób na osiągnięcie tego czy jestem lewej dając pełny dostęp lub brak dostęp w ogóle w tym przypadku.

Dzięki

+0

Niezależnie od faktu, że możesz dostosować swoje konto (jest tak wiele nieznanych ...), to naprawdę bardzo interesujące pytanie. Wciąż bawię się kluczem i prywatnym interfejsem w tej chwili! –

Odpowiedz

26

To zależy co masz na myśli przez „miły sposób” :) Na comp.lang.C++. Moderowany mieliśmy to samo pytanie jakiś czas temu. Możesz zobaczyć dyskusję, którą wygenerował there.

IIRC, skończyło się na używaniu podejścia "przyjaciel klucza zagnieżdżonego". Stosowane do przykładu, będzie to wydajność:

class A 
{ 
}; 

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

    void setFlags(Key){setFlags();}   

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

Chodzi o to, że setFlags publiczne() musi być wywołana z „kluczem”, a tylko przyjaciółmi kluczowych można utworzyć jedną, a jego konstruktor jest prywatny.

+0

+1: Nie widziałem tego wcześniej - naprawdę bardzo sprytny. –

+0

Naprawdę sprytny. Zwykle polegałem na "kontrakcie", ponieważ nie walczyłem w żaden sposób do tego ... uczysz się każdego dnia! –

+0

Nawiasem mówiąc, w pytaniu OP, chciał uzyskać dostęp do setState, a nie setFlags ... tak jestem pedantyczny ... –

7

Jednym ze sposobów jest poprzez wyraźnych interfejsów, ponieważ implementor z interfejsem mogą wybierać którzy dają im:

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

To prywatny wzór interfejsu: http://www.objectmentor.com/resources/articles/privateInterface.pdf –

2

możesz zrobić następujące rzeczy ..

class A{ 
}; 

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

}; 

class RestrictedB :public B{ 
    friend class A; 
}; 
Powiązane problemy