Zugriff auf Methoden abgeleiteter Klassen die allerdings nicht in der Basisklasse definiert sind mit Basisklassenzeiger



  • 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 🕶



  • fluxy schrieb:

    Leider schmiert das Programm beim Einfügen in die Map ab. Kann mir jemand sagen warum ?!

    IMHO soll man in deinem Fall besser std::vector, oder sogar std::list benutzen, da du keinen Funtionalität von std::map in deinem source code brauchst. du brauch auch kein "static int counter", weil push_back benutzt werden kann.



  • sorry aber das ist falsch.

    Ich muss einen Zugriff auf meine XComBase Zeiger haben. Das Problem ist das die Anwendung nicht jeden Pointer selbst speichern soll, sondern das der Manager übernimmt. Der Manager gibt dabei beim einfügen in die Map einen key zurück, über den das Element identifiziert werden kann. Um die Instanz zu bekommen, wird genau dieser Schüssel wieder angegeben.

    Soweit ich weiss, ist das mit std::vector nicht möglich. Dort müsste ich meine Instanz erst suchen.



  • fluxy schrieb:

    sorry aber das ist falsch.

    Ich muss einen Zugriff auf meine XComBase Zeiger haben. Das Problem ist das die Anwendung nicht jeden Pointer selbst speichern soll, sondern das der Manager übernimmt. Der Manager gibt dabei beim einfügen in die Map einen key zurück, über den das Element identifiziert werden kann. Um die Instanz zu bekommen, wird genau dieser Schüssel wieder angegeben.

    Soweit ich weiss, ist das mit std::vector nicht möglich. Dort müsste ich meine Instanz erst suchen.

    du fügst die Daten so in die Map ein:

    static int counter = 0; 
    ...
    plgStack.insert(make_pair (counter, ptr_base)); 
    *mglog << "Neues Element in map eingefügt mit ID " << counter << endl; 
    counter++;
    

    du fügst "counter" als der Schlüssel ein und bekomst die folgende Datei:

    plgStack[0] == ptr_base1
    plgStack[1] == ptr_base2
    ...
    plgStack[n] == ptr_baseN
    

    wenn du so schreibst:

    std::vector<"typeof(ptr_base)"> plgStack;
    ...
    plgStack.push_back(ptr_base);
    

    kannst du deine Datei genauso bekommen:

    plgStack[0] == ptr_base1
    plgStack[1] == ptr_base2
    ...
    plgStack[n] == ptr_baseN
    

    oder hab ich was wieder falsch verstanden?



  • fluxy schrieb:

    mape_pair: wie das aussieht weiss ich nicht, dass ist eine C++ Funktion, ich glaube der ist in map.h definiert. .

    map.h gibt es nicht, alle Header der Standardbibliothek haben keine Endung. std::pair und dazugehörige std::make_pair befinden sich in <utility>.

    std::make_pair ist dazu da, die explizite Angabe von Template-Argumenten zu umgehen, das heißt die Typen werden aus der Parameterliste hergeleitet. Auf diese Weise funktionieren viele andere Algorithmen des Standardbibliothek, siehe <functional> 🙂



  • well done Shio.

    Aber was mache ich da denn nun falsch?



  • mit dem Vector:

    ja, ist komplett richtig, aber: Eine Map ist so organisiert dass ich den Schlüssel direkt finde. Bei einem Vector müsste ich wissen, das wievielte Element es ist, welches eiengefügt wurde weil es nur ein Array ist. Das Arrayelement ist aber keine wirklich keyangabe, das ist der Unterschied.



  • fluxy schrieb:

    mit dem Vector:

    ja, ist komplett richtig, aber: Eine Map ist so organisiert dass ich den Schlüssel direkt finde. Bei einem Vector müsste ich wissen, das wievielte Element es ist, welches eiengefügt wurde weil es nur ein Array ist. Das Arrayelement ist aber keine wirklich keyangabe, das ist der Unterschied.

    Das Arrayelement ist in deinem Fall wirklich Keyangabe.



  • fluxy schrieb:

    well done Shio.

    Aber was mache ich da denn nun falsch?

    sieht deine declaration von plgStack genauso aus?

    std::map<int, XComBase*> plgStack?



  • ja genau so...



  • fluxy schrieb:

    ja genau so...

    mist

    und so:

    //plgStack.insert(make_pair (counter, ptr_base)); 
    plgStack[counter] = ptr_base;
    

    ?



  • wieso sagtest du misst?

    das plgStack[counter] = .... ist schwachsinn, weil ich meine Plugins nicht numerisch halten will, auch wenn die variable counter darauf schliessen lässt. Ich will da dynamischer bleiben.



  • fluxy schrieb:

    das plgStack[counter] = .... ist schwachsinn, weil ich meine Plugins nicht numerisch halten will, auch wenn die variable counter darauf schliessen lässt. Ich will da dynamischer bleiben.

    map::operator[] Inserts an element into a map with a specified key value.

    Type& operator[](
    const Key& _Key
    );

    Parameter
    _Key
    The key value of the element that is to be inserted.
    Return Value
    A reference to the data value of the inserted element.

    Remarks
    If the argument key value is not found, then it is inserted along with the default value of the data type.

    operator[] may be used to insert elements into a map m using m[_Key] = DataValue; where DataValue is the value of the mapped_type of the element with a key value of _Key.

    When using operator[] to insert elements, the returned reference does not indicate whether an insertion is changing a pre-existing element or creating a new one. The member functions find and insert can be used to determine whether an element with a specified key is already present before an insertion.


Anmelden zum Antworten