Freund-Klasse auf : geerbte Klassen sind nicht Freund?
In C++, ich habe eine Klasse A, die Freundin mit einem Klasse B.
Ich sieht aus wie geerbte Klassen von B sind nicht Freund der Klasse A.
Ich diese Einschränkung von C++ oder mein Fehler ?
Hier ist ein Beispiel. Beim kompilieren, bekomme ich eine Fehlermeldung in der Zeile "return new Memento":
Memento::Memento : unmöglich, Zugriff private member deklariert in Erinnerung.
class Originator;
class Memento
{
friend class Originator;
Memento() {};
int m_Data;
public:
~Memento() {};
};
class Originator
{
public:
virtual Memento* createMemento() = 0;
};
class FooOriginator : public Originator
{
public:
Memento* createMemento()
{
return new Memento; //Impossible to access private member of Memento
}
};
void main()
{
FooOriginator MyOriginator;
MyOriginator.createMemento();
}
Konnte ich natürlich hinzufügen FooOriginator als Freund von Memento, aber dann, das heißt, ich müsste hinzufügen, um alle Urheber-geerbte Klassen als Freund von Memento, das ist etwas möchte ich vermeiden.
Irgendeine Idee ?
InformationsquelleAutor Jérôme | 2009-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Finden Sie unter: Freund scope in C++
Gewählt exaktes Duplikat.
Richtige
Es ist die Art, wie C++ funktioniert. Ich sehe es nicht als Einschränkung.
InformationsquelleAutor Martin York
Freundschaft wird nicht vererbt, Sie explizit zu deklarieren, die jeder Freund Beziehung. (Siehe auch "Freundschaft ist nicht geerbt, transitive, oder gegenseitige")
InformationsquelleAutor sth
Freundschaft ist nicht transitiv oder übernommen werden. Nachdem alle, in Ihrem Freundes Freund kann nicht dein Freund sein-oder Ihr Vater, die Freunde sind nicht deine Freunde im Allgemeinen.
InformationsquelleAutor Tanveer Badar
Den Freund - Richtlinie war ursprünglich vorgesehen, als einige "Schlupfloch" zur Umgehung der encapsulation-Mechanismus.
Mit Freund müssen Sie angeben, genau(!), die Klassen sind dein Freund. Die Freundschaft wird nicht vererbt und so FooOriginator hat keinen Zugriff auf Memento in deinem Beispiel.
Aber am besten, bevor Sie denken, wie Sie Ihr problem lösen mit der Freund Richtlinie, würde ich vorschlagen, einen Blick auf Ihre Konstruktion im Allgemeinen, und zu versuchen, loszuwerden, die Notwendigkeit der Verwendung Freund, wie es gesehen werden könnte, um Leben in die gleiche Kategorie wie unsere lieben springen 🙂
Freund ist nicht schlecht. es ist toenhance Kapselung innerhalb einer logisch-Gruppe von zwei oder mehr Klassen, die zusammen gehören, aber nicht in ein Modul, da gibt es keine (und keine Modul-Ebene-Schutz): stattdessen verwenden Sie friend in C++ anstelle von internen oder Paket-level-Schutz in java.
aber ich denke, es ist wie springen: springen ist auch nicht schlecht. aber bevor Sie etwas anderes tun, und vergewaltigen Sie Ihren code mit endlosen Zustand von Variablen und Krempel den Umfang mit Ihnen, verwenden Sie einfach eine goto und halten Sie Ihren code sauber. das gleiche kann gesagt werden, im Prinzip der Freundschaft, glaube ich.
aber ich bin mit Ihnen gimpf, Freund - als goto - sollte mit bedacht verwendet werden und gezielt angewendet.
InformationsquelleAutor Kosi2801
Freundschaft wird nicht vererbt, siehe http://www.cplusplus.com/doc/tutorial/inheritance.html, Was ist von der Basisklasse geerbt?
InformationsquelleAutor Patrick