Wrapper Class
-
Hallo Zusammen,
Habe ein kleines Problem mit abgeleiteten Klassen und einer Wrapper Klasse. Hier ist was ich momentan mache:
class Base
{
doFunc1();
virtual doFunc2();
}class Der1 : public Base
{
doFunc2();
}
class Der2 : public Base
{
doFunc2();
}class Wrap
{
Der1 *d1;
Der2 *d2;
doFunc1();
doFunc2();
}Wrap::doFunc1()
{
if(somecondition)
d1->doFunc1();
else
d2->doFunc1();
}Wrap::doFunc2()
{
if(somecondition)
d1->doFunc2();
else
d2->doFunc2();
}Das Hauptprogram ruft auf:
Wrap::doFunc1();Die Wrapper functionen sollten durch pointer ersetzt werden, in etwa so:
class Wrap
{
Der1 *d1;
Der2 *d2;
(*doFunc1)();
(*doFunc2)();
}Wrap::Wrap
{
if(somecondition)
this->doFunc1 = &Der1::doFunc1;// causes C2440
this->doFunc2 = &Der1::doFunc2;// causes C2440
else
this->doFunc1 = &Der1::doFunc1;// causes C2440
this->doFunc2 = &Der1::doFunc2;// causes C2440
}Im Hauptprogram sollte es dann so aussehen:
Wrap::doFunc1();Die Zeile this->doFunc1 = ... verursacht C2440: type cast: cannot convert from (__thiscall Der1::)() to (__cdecl)().
Mir ist bewusst, dass Klassenmember sich von normalen c-funktionen unterscheiden, da dies den C2440 verursacht, aber evtl. kennt einer einen Trick, wie ich es zum Laufen bringe.
Irgendwelche Ideen?Gruss,
frankoni22000
-
Die Syntax von Memberfunktionszeigern sieht anders aus als die von einfachen Funktionszeigern. Schau dir mal diesen Link an.
-
Die Seite ist mir schon bekannt, bringt aber leider keine Lösung meines problems. Habe bereits versucht mit templates zu arbeiten, komme aber nicht weiter.
Trotzdem, danke für die Antwort.

-
Du sagst, was nicht geht, aber nicht genau, was Du eigentlich machen willst.
Kannst Du vielleicht mal erklären, was das Ziel der ganzen Sache ist?
-
Nun, in Worte zu fassen ist etwas schwierig, aber ich will es mal versuchen. Ich habe eine Basisklasse, von der drei weitere Klassen abgeleitet sind, welche Teile der Basisklasse überschreiben. Um im Hauptprogramm nicht alle drei Klassen als Objekte zu führen habe ich wiederum die drei abgeleiteten Klassen in einer Wrapper-Klasse zusammengefügt. Was mir an der Wrapper-Klasse aber nicht gefällt, ist die Tatsache, dass ich dort abhängig davon, welche der drei Klassen benutzt wird, eine Fallunterscheidung (if-else) machen muss, um die richtige abgeleitete Klasse aufzurufen. Jetzt dachte ich mir ich lege in der Wrapper-Klasse Funktionszeiger an, welche ich zur Laufzeit initialisiere und auf die benutzte Klasse verweisen lasse. Die Funktionszeiger werden vom Kompiler als __cdecl angelegt. Leider schmeisst ich der Visual Studio Kompiler mit C2440 raus, da ein Funktionscast von __thiscall nach __cdecl nicht erlaubt ist. Was ich schon gesehen habe ist, dass klassenintern Funktionszeiger erlaubt sind.
Wahrscheinlich funzt es gar nicht
und ich muss bei der Fallunterscheidung bleiben...
Vielen Dank für eure Antworten!
Frankoni
-
In diesem Fall kannst du die Wrapperklasse ruhig vergessen, das geht einfacher.
bsp;
std::vector<Base*> vec; vec.push_back(new Der1); vec.push_back(new Der2); vec[0]->func2(); // führe func2 von Der1 aus vec[1]->func2(); // führe func2 von Der2 ausDas ganze nennt sich polymorphie, danach solltest du mal googlen.
Oder in deinem Buch/Tutorial nachschauen, sollte eigentlich schon drangekommen sein wenn man vererbung hat.// EDIT:
Das mit dem std::vector war jetzt natürlich nur ein Beispiel, kansnt deine Objecte natürlich verwalten wie du möchtest, hat nichts mit polymorphie zu tun.
Machst du das mti der Wrapperklasse hätte auch das virtual in base keinen Sinn, was mich wieder dazu führt das du das ganze schon längst gehabt haben müsstest in deinem tutorial / buch
-
Danke, werd ich mal nachlesen. Buch und Vorlesung...mmhm, bin leider nicht aus der Informatikerecke und zu meiner Zeit haben wir noch Assembler in den Z80 geklopft ;-). Soll jetzt keine Entschuldigung meines Nichtwissens sein, sondern nur eine Erklärung, warum ich davon keine Ahnung habe.
vielen Dank für die Info.