Zugriff auf Methoden abgeleiteter Klassen die allerdings nicht in der Basisklasse definiert sind mit Basisklassenzeiger
-
otze schrieb:
jo, sein buch lliegt grad neben mir, hats zb mit ner typliste geschafft, was ein teufelskerl
ja, genau, es gibt keine andere Benennung
-
hmmm,
also wie viel besser sind die denn als deine Lösung. Also die Lösung mit dieser Factory habe ich noch nicht so ganz verstanden. Deshalb eine Frage:
Wenn ich die Factory benutzte dann brauche ich keinen Cast mehr auf meine anderen Klassen, also meine Anwendung braucht die anderen Klassen auf keinste weise mehr zu kennen?!?
Bitte um ne klare Antwort.
-
das interface muss immernoch gekannt werden,das is auch kein unterschied zu dynamic_cast oder dem was ich vorgeschlagen hab
und die andre lösung von Andrei Alexandrescu ist vom niveau her für uns hier unerreichbar.
-
otze schrieb:
das interface muss immernoch gekannt werden,das is auch kein unterschied zu dynamic_cast oder dem was ich vorgeschlagen hab
Geschwindigkeit? RTTI?
otze schrieb:
und die andre lösung von Andrei Alexandrescu ist vom niveau her für uns hier unerreichbar.
man braucht IMHO einfach viel Zeit, um sie zu verstehen. Aber die Idee ist SUPER
-
das interface oder die klasse? was ist wenn ich nur ein interface habe und habe eine Methode in der abgeleiteten Klasse die das interface nicht hat?
-
fluxy schrieb:
hmmm,
also wie viel besser sind die denn als deine Lösung. Also die Lösung mit dieser Factory habe ich noch nicht so ganz verstanden. Deshalb eine Frage:
Wenn ich die Factory benutzte dann brauche ich keinen Cast mehr auf meine anderen Klassen, also meine Anwendung braucht die anderen Klassen auf keinste weise mehr zu kennen?!?
Bitte um ne klare Antwort.
wie otze schrieb, muss interface gekannt werden. Wenn ich richtig verstand, du hast doch diese Information.
-
Geschwindigkeit? RTTI?
normalerweise richtig, in dem kontext aber nicht relevant
ansonsten hat ssm uneingeschränkt recht
@fluxy wenn die abgeleitete klasse eine methode hat, die kein dir bekanntes interface ansprechen kann, dann wirst du wohl auf diese methode verzichten müssen.
in einem plugin system, welches sich aus verschiedenen dlls läd könntest du eh nichts mit der "neuen" methode anfangen, da du sie nicht kennen KANNST.
-
fluxy schrieb:
das interface oder die klasse? was ist wenn ich nur ein interface habe und habe eine Methode in der abgeleiteten Klasse die das interface nicht hat?
du sollst diese Methode im interface einfügen, oder du kannst ein interface in daine Klasse einfügen, die Client nich siet:
[cpp]struct IHidden;
struct IPluggin;struct IVisitor
{
virtual void accept(IHidden *hidden) = 0;
virtual void accept(IPluggin *pluggin) = 0;
};struct IPluggin
{
virtual void init() = 0;
virtual void abort() = 0;
virtual void stop() = 0;
virtual accept(IVisitor *visitor);
};struct IHidden
{
virtual void magic() = 0;
};template<typename>
class PlugginImpl
{
};class MyPluggin1 : public PlugginImpl<MyPluggin1>, IHidden
{
virtual void magic()
{
std::cout << "make magic\n";
}virtual apply(IVisitor *visitor)
{
visitor->accept(static_cast<IHidden>(this));
}
};[/cpp]
-
Welchen Ansatz verfolgt denn dieser Typ da?
-
fluxy schrieb:
Welchen Ansatz verfolgt denn dieser Typ da?
Er dient als der Kleber, und läßt dir zu, die verborgenen Möglichkeiten deine pluggins zu benutzen
-
nein ich meinte diesen typ von dem du geredet hattest.... von der Möglichkeit die zu kompliziert sei...
Ich will es mal so ausdrücken: Wenn ich mich schon bemühen muss, eine Lösung zu verstehen, dann nehme ich doch die beste.... Vielleicht kannst du dich ja auch mal unter sebastianschabbach@gmx.de melden das geht vielleicht einfacher.
-
kauf dir modernes c++ design von andrei alexandrescou. da steht alles drin, was du wissen musst, denn für die erklärung müsste man weit ausholen
-
okay ich habe es jetzt geändert. Meine Funktion die in der Dll die instanz erstellt erwartet jetzt einen XComGuiBase (natürlich nur in der gui dll).
das ganze sieht jetzt so aus :
unsigned long XComManager::registerPlugin (unsigned long plgID, XComGuiBase* ptr_base, XGuiMessageSystem* ptr_message) { HMODULE hDll = (HMODULE) NULL; char* dllname = new char [100]; static int counter = 0; // GUI - Plugin laden if (plgID == PLG_GUI) { *mglog << "Plugin erkannt auf PLG_GUI" << endl; #ifdef WIN32 strcpy ((char*)dllname, (char*)"dll"); strcat ((char*)dllname, (char*)"\\XWin32.dll"); *mglog << "Betriebsystem erkannt auf >>WINDOWS<<" << endl; if (!(hDll = LoadLibraryEx (dllname, NULL, 0))) { *mglog << "Error binding Dll to application's address space" << endl; } /* Zeiger auf die richtige Klasse initialisieren und dann im Pluginvektor abspeichern, damit die Anwendung darauf zugreifen kann */ GUI_PLG gplg = NULL; gplg = (GUI_PLG) GetProcAddress (hDll, "XExport"); gplg (hDll, &ptr_base, ptr_message); plgStack.insert(make_pair (counter, ptr_base)); *mglog << "Neues Element in map eingefügt mit ID " << counter << endl; counter++; #else //Lade Linuxpluigin #endif } // Render - Plugin laden else if (plgID == PLG_RENDER) { } return 0; }
Leider schmiert das Programm beim Einfügen in die Map ab. Kann mir jemand sagen warum ?!
-
wieso castest du hier?
strcpy ((char*)dllname, (char*)"dll"); strcat ((char*)dllname, (char*)"\\XWin32.dll");
das sind doch schon beides char*(und wieso benutzt du die c style casts?)
-
Emmm hat keinen besonderen Grund... Es ist weil wir in der Firma reines C programmieren und ich nicht immer hinundherswitschen kann. Muss mich irgendwie auch den gegebenheiten anpassen.
-
aber da sind absolut keine casts notwendig ?!
auch der cast is sinnfrei:HMODULE hDll = (HMODULE) NULL;
btw:
stürzt das programm nich vielleicht schon hier ab?GUI_PLG gplg = NULL; gplg = (GUI_PLG) GetProcAddress (hDll, "XExport"); gplg (hDll, &ptr_base, ptr_message);
ist gplg(was heisst das?) auch sicher nicht null?
-
nein dasd programm stürzt da noch nicht ab habe es überprüft
1.) der Zeiger ptr_base ist gültig, also kein Nullpointer oder ähnliches
2.)
extern "C" typedef unsigned long (*GUI_PLG) (HINSTANCE hdll, XComGuiBase**, XGuiMessageSystem*);
-
wie sieht make_pair aus?
ging da nich ein normales std::pair?
-
mape_pair: wie das aussieht weiss ich nicht, dass ist eine C++ Funktion, ich glaube der ist in map.h definiert.
Keine Ahnung.... Ich kenn mich auch nicht besonders mit maps aus...
-
fluxy schrieb:
nein ich meinte diesen typ von dem du geredet hattest.... von der Möglichkeit die zu kompliziert sei...
otze hat alles richtig gesagt:
kauf dir modernes c++ design von andrei alexandrescou. da steht alles drin, was du wissen musst, denn für die erklärung müsste man weit ausholen
mein Deutsch ist leider sehr primitiv, um dir erklären zu können. kauf dir dieses Buch, und versuch selbst zu verstehen. ich kann nur eins sagen : das Buch ist genial aber sehr-sehr-sehr schwer(für mich persönlich). ich kann dir nur empfählen, zuerst dieses gute Buch [url]http://www.amazon.com/gp/reader/0201633612/ref=sib_dp_pt/103-9710516-2359029#reader-link [/url] zu lesen und, wenn du nicht besonders fit in templates bist noch dieses http://www.amazon.com/gp/reader/0201734842/ref=sib_dp_pt/103-9710516-2359029#reader-link. sie sind ziemlich cool