Wie man Freund für abgeleitete Klassen propagiert
Ich möchte eine Klassenhierarchie, und können zum erstellen von Objekten aus, die es nur innerhalb einer Fabrik.
Beispiel:
class Base
{
protected:
Base(){};
virtual void Init(){};
friend class Factory;
};
class SomeClass : public Base
{
public://I want protected here! Now it's possible to call new SomeClass from anywhere!
SomeClass(){};
void Init(){};
};
class Factory
{
public:
template<class T>
T* Get()
{
T* obj = new T();
obj->Init();
return obj;
}
};
int main()
{
Factory factory;
SomeClass *obj = factory.Get<SomeClass>();
}
Mein problem ist, dass ich möchte in der Lage sein, um Objekte, die nur von der Fabrik, aber ich will nicht zu erklären friend class Factory
in jeder Klasse abgeleitet von der Basisklasse.
Gibt es eine Möglichkeit, zu propagieren Freund in abgeleiteten Klassen? Gibt es eine andere Möglichkeit, dieses Verhalten zu erreichen?
Kommentar zu dem Problem
Sie können nicht Erben
Freund
Schiff. Siehe diese Antwort: stackoverflow.com/questions/13844129/... Beachten Sie, dass
protected
ist nur geringfügig restriktiver als public
. Niemand wäre in der Lage, zu Erben von SomeClass
und eine Möglichkeit bieten, in Ihrer protected
Mitglieder. InformationsquelleAutor der Frage Felics | 2012-12-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es wird bewusst impossibile.
Ist ein Problem durch Kapselung.
Angenommen, eine Klasse "PswClass" zu verwalten, dass jedes Passwort, das ist cascade Freund mit anderen in der Klasse: wenn ich Erben von PswClass:
In dieser Art kann ich, vielleicht, haben Zugang zu Feld, es wäre privat.
InformationsquelleAutor der Antwort Luca Davanzo
Freundschaft ist weder geerbt, noch transitiv, wie hier beschrieben: Freund Klasse mit Vererbung.
Nach ein wenig Experimentieren, und die Nutzung dieser hack Wie einrichten eines globalen container (C++03)?, ich glaube, ich habe einen Weg gefunden, den "factory" - Rechte zum einmaligen erstellen der Objekte.
Hier ist eine quick-and-dirty code. (Scrollen Sie nach unten, um zu sehen, der hack.)
InformationsquelleAutor der Antwort Masked Man
Nein, es gibt keinen Weg, um zu Erben
friend
Erklärung aus der Basis-Klasse. Allerdings, wenn Sie machenBase
Konstruktorprivate
Instanzen von abgeleiteten Klassen nicht möglich sein, erstellen Sie ohneFactory
helfen.InformationsquelleAutor der Antwort Bartek Banachewicz
Wie die anderen schon gesagt, Freundschaft ist nicht vererbbar.
dieser sieht aus wie ein guter Kandidat "Abstract Factory" - Muster.
übernehmen "SomeClass"es-abgeleitet von der Basisklasse polymorph verwendet werden.
deklarieren Sie eine abstrakte Fabrik-Basis, die schafft Base Objekte.
ableiten jedem konkreten Werk von base, überschreiben Sie die Basis-Methode zur Erstellung von...
sehen http://en.wikipedia.org/wiki/Abstract_factory_pattern für Beispiele
InformationsquelleAutor der Antwort
Können Sie nicht tun. Dies geschieht zum Schutz der Kapselung. Siehe diesen Beitrag: Warum hat C++ nicht erlauben geerbt Freundschaft?
InformationsquelleAutor der Antwort Adri C.S.
Für die Zukunft, eine andere Idee, die kam aus dem chat zwischen OP und mir, die funktioniert mit nur einem Einsatz von
friend
als die OP wollte. Natürlich, dies ist nicht eine Universelle Lösung, aber es kann in einigen Fällen hilfreich sein.Code unten ein minimal eine, die zeigt die wesentlichen Ideen. Diese muss "integriert" in den rest der
Factory
code.InformationsquelleAutor der Antwort Masked Man