Rückgabe eines Objectpointers aus einer Klassenfunktion

Einloggen oder registrieren, um einen Kommentar zu schreiben
Christian Stern
359
Christian Stern  

Hallo zusammen,


ich knabbere schon den ganzen Tag an dem Problem und komm da nicht weiter.


Also ich habe eine Liste mit geladenen Objekten ( class1 und class2 ). Beide Verfügen z.B. über eine Funktion namens printMsg().

Ich möchte nun über eine Funktion mir den Pointer der auf zurufenden Klasse geben lassen.


Soweit ich gelesen habe kann man mit "&" eine Referenze übergeben und somit sollte ich z.B. in meiner Funktion auf Methoden der referenzierten Object drauf zugreifen können.

Wenn ich z.B.:

void changeName(string &name)  { name=Frank; }


string my_name = "Fritz";

changeName(my_name);

mache, dann  hat zum Schluss die Variable my_name den Namen Frank.


Sobald ich das aber mit einem Object versuche, bekomme ich keine Referenz zurück. Hier mal ein Beispiel:


//*******************************************************************
class classBase {
public:
   virtual void  printMsg() {};
};

//*******************************************************************
class class1 : public classBase {
private:
protected:
public:
   void class1(){Print(__FUNCTION__," Constructor");}
   void ~class1(){Print(__FUNCTION__," Destructor");}
   void printMsg();     
};
void class1::printMsg() {
   Print(__FUNCTION__, "INFO: printMsg class1...............");
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class class2 : public classBase {
private:
protected:
public:
   void class2(){Print(__FUNCTION__," Constructor");}
   void ~class2(){Print(__FUNCTION__," Destructor");}
   void printMsg();    
};
void class2::printMsg() {
   Print(__FUNCTION__, "INFO: printMsg class2...............");
}

//**************************************************************************************************************************************//
classBase* classList[];  

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(){

   Print("****************************************************************");
  
   // resizing of an array
   ArrayResize(classList,ArraySize(classList)+2);
  
   // add a object to list
   classList[0] = new class1;
   classList[1] = new class2;

   // get object pointer
   classBase* object;

   getObject(1,object);

   object.printMsg();
 
   return(INIT_SUCCEEDED);
}

void getObject ( int id, classBase &pointer ) {

   if(CheckPointer(GetPointer(classList[id])) !=POINTER_INVALID ) {
      Print("INFO: Found object pointer... ");
      pointer = GetPointer(classList[id]);
      pointer.printMsg();
      Print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
   }else{
      Print("ERROR: No object found....");
   }
}



Nach dem Aufrufen der Funktion getObject bleibt die Object Variable leer: object.printMsg();

Aber innerhalb der Funktion greift er auf die Funktion "pointer.printMsg();" Problemlos zu.


Wenn ich die Funktion mit Referenze aufrufe, dann gibts ein Fatal Error:

void getObject ( int id, classBase &pointer ) { ...}


Kann mir da bitte jemand helfen ? Danke

Carl Schreiber
Moderator
9941
Carl Schreiber  

Ich über geben einen Pointer auf ein Objekt so:

void getObject ( int id, classBase* pointer )

& ist für Variablen, die als, Refenzen übergeben werden (müssen).

Da pointer kein Array ist brauchst Du das & nicht!

Christian Stern
359
Christian Stern  
Die übergabe an eine Funktion funktioniert. Jedoch möchte ich aus einer Klasse einen Pointer zurückgeben und dann über diesen eine Funktion aufrufen.
Carl Schreiber
Moderator
9941
Carl Schreiber  

Na dann versuch: void getObject ( int id, classBase* &pointer ){ ..

oder  classBase* pointer = getObject(int id){ ..

Ich habe 'meinen' code (mit *) nicht probiert, aber kann es sein, dass ohne * aus pointer das Objekt wird - kind of cast?

Bist Du mit dem Debugger durch Deinen Code gegangen?

Christian Stern
359
Christian Stern  
Vielen Dank !! Is ja eigentlich auch klar .. einen Pointer* als Referenze& übergeben ?? Naja ...waren vielleicht gestern zu viele Bäume im Wald :D
Carl Schreiber
Moderator
9941
Carl Schreiber  
Naja ...waren vielleicht gestern zu viele Bäume im Wald :D

Das ist mir auch schon passiert ;)

Einloggen oder registrieren, um einen Kommentar zu schreiben