Frage

Ich versuche, eine Linkliste zu erstellen, aber ich Probleme Objekte innerhalb einer Funktion zu schaffen und Zeiger auf ihre Adressen zuweisen, da ich sie glauben, gehen aus dem Rahmen, wenn die Funktion beendet. Ist das wahr? Und wenn ja, wie kann ich ein Objekt außerhalb des Haupt erstellen und verwenden es immer noch?

War es hilfreich?

Lösung

Erstellen Sie die Objekte mit dem neuen Betreiber. dh

void foo( myObject* bar1, myObject* bar2 )
{
  bar1 = new myObject();
  bar2 = new myObject();
  // do something
}

int main( int argc, char* argv[] )
{
  myObject* thing1;
  myObject* thing2;
  foo( thing1, thing2 );

  // Don't forget to release the memory!
  delete thing1;
  delete thing2;

  return 0;
}

Andere Tipps

Sie sind richtig, lokale Variablen außerhalb des Bereichs am Ende des Funktionsbausteins gehen. Sie müssen Zeiger auf die Objekte erstellen und ordnen sie mit neuen . Und vergessen Sie nicht, das Objekt zu löschen, wenn Sie es aus der Liste zu entfernen.

Wenn Sie mit dem Ärger und Fehlern behandeln wollen nicht, dass mit Zeigern kommen, finden Sie unter boost :: shared_ptr statt.

Mit den neuen Betreiber:

void f()
{
  CMyObject *p = new CMyObject();
  List.AddTail(p); // Or whatever call adds the opbject to the list
}

Achten Sie auf das Objekt gelöscht, wenn Ihre Liste zerstört wird.

Warum speichern Sie keine Objekte (nicht Zeiger auf Objekte) in der Liste? Creator-Funktion Objekt zurück.

Wenn Sie wirklich brauchen Liste von Zeigern spezielle Zeigerliste Container prüfen, mit (boost::ptr_list) oder Speichern von Smart Pointer darin (boost::shared_ptr). Um zu verhindern, Objekte außerhalb des Bereichs gehen, nachdem sie von Funktion zurückkehrt, müssen Sie sie dynamisch mit Operator zuweisen neu.

Die akzeptierte Antwort ist nicht richtig. In der Funktion

void foo( myObject* bar1, myObject* bar2 )
{
  bar1 = new myObject();
  bar2 = new myObject();
  // do something
}

die neu zugewiesene Objekt werden lokale Variablen zugewiesen. Sie haben keinen Einfluss auf die Werte des Zeigers in der Aufruf-Funktion.

int main( int argc, char* argv[] )
{
  myObject* thing1;
  myObject* thing2;
  foo( thing1, thing2 ); // thing1 and thing2 don't get assigned
                         // They continue to be uninitialized in
                         // this function

  // Don't forget to release the memory!
  delete thing1;  // These two deletes will lead to undefined behavior.
  delete thing2;

  return 0;
}

Was Sie brauchen, ist:

void foo( myObject*& bar1, myObject*& bar2 )
{
  bar1 = new myObject(); // Now the value of the pointers in the calling
  bar2 = new myObject(); // will be changed since the pointers are passed by reference.
  // do something
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top