friend Klasse (provokante Frage)
-
Hi Community,
ich wollte mal fragen, was ihr von diesen friend-Trick haltet?
Angenommen es gibt eine Klasse Window, in der eine geschützte Methode ist (die man selber umbedingt aufrufen will, ohne das Design der Klasse Window zu ändern bzw. ändern zu wollen).
void Test::DoSomething(Window *pWindow) { class SpecialWindow : public Window { friend class Test; }; (static_cast<SpecialWindow*>(pWindow))->DoSomethingProtected(); }Ich würde auf keinen Fall meine Klasse Test als friend in Window eintragen.
Ist dieser Hack (!) ok oder wie würdet ihr es lösen?
-
dein "Hack" funktioniert nur, wenn dir der compiler net dazwischenfuscht. beim dereferenzieren könnte dir genausogut das programm abrauschen.
noch schlimmer wäre, wenn der übergebene zeiger schon nur ein basisklassenzeiger auf das Objekt ist, also das übergebene Objekt bereits von Window abgeleitet wurde.
Denn dann würdest du nicht nur von base auf ein nicht vorhandenes derived casten, sondern sogar einen crosscast zwischen derived und "hypothetisches derived" machen.=> nicht okay.
/7edit obwohl...das programm würde eigentlich nicht immer zwingend abstürzen, das ergebnis ist einfach nur undefiniert.
-
Ich muß hinzufügen, daß die Methode 'DoSomethingProtected' als virtual deklariert ist.
Und mein Compiler schluckt es (und auch zur Laufzeit funktioniert es), obwohl pWindow wirklich ein abgeleitetes Objekt ist bzw. meine reelle Methode sogar eine Liste von (abgeleiteten) Window-Objekten bearbeitet.Aber wie geht es besser???
-
"friend" ist wohl nie so wirklich befriedigend; "anders" geht's doch ganz einfach:
class SpecialWindow : public Window { //... public: void DoItPublicNow() { /*this->*/DoSomethingProtected(); } };Aber davon mal abgesehen stellt sich doch mehr die Frage ob man denn eine "protected" Methode so exponieren sollte.
Aus irgendeinem Grund wird sie ja "protected" sein; vielleicht verletzt man irgendeine Prä- oder Postkondition o.ae.
Es könnte z.B. sein dass die Methode nur innerhalb einer Schablonenmethode (meint hier das Muster
http://www.vico.org/pages/PatronsDisseny/Pattern%20Template%20Method/index.html und nicht (C++)templates) gerufen werden sollte, die eine Policy garantiert etc.Grüsse
*this
-
und das kompiliert ?

-
inp schrieb:
und das kompiliert ?

Bei mir mit VC 05 Exp Ed. schon.
Und es läuft auch.Bei Dir nicht?
Compiler?Grüsse
*this
-
Gast++ schrieb:
inp schrieb:
und das kompiliert ?

Bei mir mit VC 05 Exp Ed. schon.
Und es läuft auch.Bei Dir nicht?
Compiler?Grüsse
*this
habs nicht probiert,
hab nur mit meinem kritischen auge bewertet.