Vererben Freundschaft in C ++?
-
16-09-2019 - |
Frage
Seit Klasse Freundschaft in C ++ nicht vererbt wird, was ist der beste Weg, um „fake“ oder?
Ich dachte an dem Freund Klasse private Schnittstelle durch geschützte Methoden in der zu-vererbten Basisklasse auszusetzen, aber das ergibt mit der gleichen Schnittstelle zweimal zu schreiben (und zu halten).
Gibt es andere Möglichkeiten?
Lösung
Die Verwendung einer Taste ist eine mögliche Lösung.
Die Idee ist, dass Sie nur die Operationen freischalten können, wenn Sie einen Schlüssel ... aber ein Beispiel ist im Wert von Tausenden auf Wort taucht also lasst sie:
// 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);
};
Die Frage des Schlüssel Seiner Kopie konstruierbar ist bis zu Diskussion. Ich verstehe nicht, was Sie verhindern, dass es gewinnen.
Ein weiterer Vorteil ist, dass Sie mehrere Schlüssel haben kann, je nachdem, welche Methode Sie zugreifen möchten, auf diese Weise Sie ‚teilweise‘ Freundschaft gewähren, und Ihre ‚teilweise‘ Freunde können nicht herumspielen mit Ihrem privaten Teile, trotz der berühmten Anspruch!
Bearbeiten :
Diese Methode ist begrenzt Freundschaft genannt und wurde auf comp.lang.c ++. moderierte .
Der Hauptvorteil dieses Verfahrens im Vergleich zu rel="noreferrer">, ist die lose Kopplung, da nur vorwärts Erklärungen notwendig sind.
Andere Tipps
Die Kinder der Klasse mit Freundschaft braucht es Eltern zu bitten, den Zugang für sie zu tun.
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
}
};
Nicht sicher, ob dies ist nicht das, was Sie bereits darüber nachzudenken, aber hier ist ein