Ja, das stimmt.
Ich versuche seit geraumer Zeit, die Methode zu befürworten, die grundlegende Idee besteht darin, eine Key
-Klasse zu verwenden.
Obwohl dies den Gebrauch von friend
tatsächlich nicht entfernt, reduziert es den Satz von offengelegten Implementierungsdetails.
Klasse setzen;
// 1. Definieren Sie die Schlüsselklasse
Klasse set_key: unvererbbar { Freundesklasse setzen; set_key() {} ~set_key() {} };
Klasse festlegen
{
// 2. Definieren Sie den Iterator
Klasse iterator
{
Öffentlich:
void öffentliche_methode();
void eingeschränkte_methode(set_key&);
}; // Klasse iterator
}; // Klasse setzen
Jetzt ist eingeschränkte_methode
öffentlich, sodass set
keinen speziellen Zugriff auf iterator
benötigt. Die Verwendung davon ist jedoch auf diejenigen beschränkt, die in der Lage sind, eine Instanz von set_key
zu übergeben... und bequemerweise kann nur set
ein solches Objekt erstellen.
Beachten Sie, dass set
tatsächlich eine set_key
-Objekt an jemanden weitergeben kann, dem es vertraut. Es handelt sich um einen Schlüssel im traditionellen Sinn: Wenn Sie einen Schlüssel Ihrer Wohnung jemandem geben, kann er ihn einer anderen Person anvertrauen. Aufgrund der Semantik der Schlüsselklasse (nicht kopierbar, nur set
darf sie erstellen und zerstören) ist dies normalerweise jedoch auf die Dauer des Gültigkeitsbereichs des Key
-Objekts beschränkt.
Beachten Sie, dass immer ein böser Hack möglich ist, nämlich *((set_key*)0)
. Dieses Schema schützt vor Murphy, nicht vor Machiavelli (in C++ ist es sowieso unmöglich).