Zeiger oder Referenz

BOND_WR

Mitglied
Hallo,

ich habe bei mir einen Effekt den nicht ganz verstehe.
Zur Erklärung ein Codebeispiel:

Code:
BOOL Func1();
BOOL Func2( C_MyClass1 *p_myObj );


BOOL Func1() {

C_MyClass1 l_myObj;

Func2( l_myObj );

return TRUE;
}

BOOL Func2(  C_MyClass1 *p_myObj ) {

p_myObj = new C_MyClass1();

p_myObj->AddText( _T("BlaBla") );

return TRUE;
}

Wenn ich in Func1 auf die Eigenschaften von p_myObj (z.B. GetText ) zugereifen will, ist nichts enthalten. p_myObj erhält mit new() in Func2 zwar eine neue Adresse aber in Func1 hat p_myObj dieselbe Adresse wie zu Beginn.

Ich weiss das dies zu den Grundlagen gehört aber ich stehe auf dem Schlauch.
 
Hi.

Erstmal bin ich überrascht, das der Code überhaupt kompiliert wird.

Dann bin ich verwirrt, weil ich nicht weiß was du machen willst?!

Du bekommst in der Funktion Func2 einen Zeiger / eine Adresse auf ein (bestehendes!) Objekt übergeben. Diese Adresse überschreibst du dann mit einem neuen Objekt.

Logischerweise hast du das Originalobjekt, von dem die Adresse übergeben werden sollte, nicht geändert - du hast ja nicht mal versucht drauf zuzugreifen.
C++:
void func2(C_MyClass1 * pObj) {
  pObj->AddText( _T("BlaBla") )
}
void func1() {
  C_MyClass1 myClass1;

  func2(&myClass1);
}
 
Hallo und vielen Dank.

Ich möchte in Func2 eine Liste von C_MyClass1 Objekten füllen, wobei ich in Func1 Zugriff auf das zuletzt angelegte Objekt haben will.

Code:
BOOL Func2(  C_MyClass1 *p_myObj ) {

p_myObj = new C_MyClass1();

// p_myObj mit Infos füllen
....

m_myList.AddTail( p_myObj );

return TRUE;
}

Ich hoffe es ist verständlich.
In Func1 muss ich dann das zuletzt erstellte Objekt aus Func2 in die Liste einfügen.
 
Hallo und vielen Dank.

Ich möchte in Func2 eine Liste von C_MyClass1 Objekten füllen, wobei ich in Func1 Zugriff auf das zuletzt angelegte Objekt haben will.
Warum machst du's dann so kompliziert? Du mußt doch einfach nur einen Zeiger auf das Objekt als Ergebnis der Funktion Func2 zurückgeben. Falls kein Objekt erstellt wurde bzw. ein Fehler auftrat, gibst du 0 zurück...

Ansonsten, wenn du über einen Ausgabeparameter einen Zeiger zurückgeben willst, mußt du einen Zeiger auf diesen Zeiger übergeben:
C++:
C_MyClass1* x;

Func2(&x);

bool Func2(C_MyClass1** p_myObj) {
  *p = new C_MyClass1();

  (*p)->addText(...);
}
Gruß
 
Zurück