Pointerproblem



  • Hallo,

    ich will eine Methode einer Klasse von mir für verschiedene Basisklassenpointer überladen und den pointer den ich der Methode als Buffer mitgebe, initialisieren. In der Methode selber wird der Pointer auch initialisiert, nur wenn ich aus der Methode herausspringe, ist der Parameter, den ich als buffer mitgab, wieder NULL.

    Ich weiss nicht woran es liegt und habe öfters diese Probleme damit.

    void XComManager::GetPlugin (int pos, XComGuiBase* ptr_plugin)
    {
    	map<int, XComBase*>::iterator data = plgStack.find(pos);
    
    	if (data != plgStack.end ())
    	{
    		XComBase* ptr_base = data->second;
    		ptr_plugin = static_cast<XComGuiBase*>(ptr_base);
    
    	}
    	else
    	{
    		_KNFEXCEPTION("Zu dem angegebenen Schlüssel kann kein Plugin ermittelt werden");
    	}
    }
    

    Ich hatte das ganze mal mit dem XComGuiBase** als Parameter ausprobiert und die Addresse von nem temporären Hilfsbuffer mitgegeben, aber dort entstand das selbe Problem.

    Weiss jemand, was hier das Problem ist?

    Gruß Sebastian



  • fluxy schrieb:

    Weiss jemand, was hier das Problem ist?

    Ein Zeiger wird per value uebergeben. dh deine Funktion nimmt die Kopie eines Zeigers als Parameter. Du willst aber scheinbar eine Referenz auf den Zeiger statt einer Kopie.

    btw: ein return wert würde es hier auch tun...



  • fluxy schrieb:

    Weiss jemand, was hier das Problem ist?

    Gruß Sebastian

    Hallo Sebastian!!!
    da min ich wieder!
    mach mal so:

    [cpp]
    void XComManager::GetPlugin (int pos, XComGuiBase** ptr_plugin)
    {
    map<int, XComBase*>::iterator data = plgStack.find(pos);

    if (data != plgStack.end ())
    {
    XComBase* ptr_base = data->second;
    ptr_plugin = static_cast<XComGuiBase>(ptr_base);

    }
    else
    {
    _KNFEXCEPTION("Zu dem angegebenen Schlüssel kann kein Plugin ermittelt werden");
    }
    }
    [/cpp]
    😉



  • Danke schonmal.

    Returntyp geht nicht weil:

    1.) Ich habe mehrere abstrakte Basisklassen. Für jeden Basisklassenzeiger wird es eine überladene Methode geben. Würde ich den Parameter weglassen und nen return machen würde das so aussehen:

    XComGuiBase* GetPlugin (int pos);
    XComRenderSpec* GetPlugin (int pos);
    XComNetworkBase* GetPlugin (int pos);
    

    und da würde der Compiler meckern, weil er keine Überladung findet. Deshalb muss ich es mit dem Parameter machen. Wie meinst du das mit der Referenz? Kannst mir das mal als code posten?



  • fluxy schrieb:

    Wie meinst du das mit der Referenz? Kannst mir das mal als code posten?

    void wrongNew(char* p)
    {
      p=new char[100];
    }
    
    void rightNew(char*& p)
    {
      p=new char[100];
    }
    
    int main()
    {
      char* p=0;
      wrongNew(p);
      //p==0
    
      rightNew(p);
      //p!=0
      delete [] p;
    }
    


  • fluxy schrieb:

    und da würde der Compiler meckern, weil er keine Überladung findet. Deshalb muss ich es mit dem Parameter machen. Wie meinst du das mit der Referenz? Kannst mir das mal als code posten?

    du kannst es auch so machen:

    template<typename T>
    T * GetPlugin (int pos)
    {
        map<int, XComBase*>::iterator data = plgStack.find(pos);
    
        if (data != plgStack.end ())
        {
            XComBase* ptr_base = data->second;
            return static_cast<T*>(ptr_base);        
        }
        else
        {
            _KNFEXCEPTION("Zu dem angegebenen Schlüssel kann kein Plugin ermittelt werden");
        }
    }
    

    und so aufruffen:

    XComGuiBase *pl1 = GetPlugin<XComGuiBase>(1);
    XComRenderSpec *pl2 = GetPlugin<XComRenderSpec>(5);
    XComNetworkBase *pl3 = GetPlugin<XComNetworkBase>(12);
    


  • super wunderbar das hilft!

    Aber sag mal... Wie machte man es denn in purem C wenn man so ne Problematik hatte? Also Überladung geht da nicht das ist mir klar, aber Referenzen ja auch nicht... Hast du da auch noch nen Trick auf Lager?

    Danke schonmal für deine Hilfe.
    Gruß Sebastian



  • fluxy schrieb:

    Wie machte man es denn in purem C wenn man so ne Problematik hatte? Also Überladung geht da nicht das ist mir klar, aber Referenzen ja auch nicht... Hast du da auch noch nen Trick auf Lager?

    ich würde in Pure C **void **** nutzen



  • In C würde man statt

    XComGuiBase *pl1 = GetPlugin<XComGuiBase>(1);
    

    wohl sowas machen

    XComGuiBase *pl1 = GetPlugin_XComGuiBase(1);
    

    Bzw als Referenz Parameter einen Zeiger Parameter benutzen.


Anmelden zum Antworten