Question

J'essaie de créer une liste de liens, mais je ne parviens pas à créer des objets dans une fonction ni à attribuer des pointeurs à leurs adresses, car je pense qu'ils sortent du cadre lorsque la fonction est fermée. Est-ce vrai? Et, si oui, comment puis-je créer un objet en dehors de l'objet principal et continuer à l'utiliser?

Était-ce utile?

La solution

Créez les objets avec l'opérateur new. c'est-à-dire

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;
}

Autres conseils

Vous avez raison, les variables locales seront hors de portée à la fin du bloc de fonction. Vous devez créer des pointeurs sur les objets et les allouer avec new . Et n'oubliez pas de supprimer l'objet lorsque vous le supprimez de votre liste.

Si vous ne voulez pas vous soucier des tracas et des bugs liés aux pointeurs, consultez boost :: shared_ptr à la place.

utilisez le nouvel opérateur:

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

Faites attention à la suppression d'objets lorsque votre liste est détruite.

Pourquoi ne stockez-vous pas les objets (pas les pointeurs sur les objets) dans la liste? La fonction creator retournera un objet.

Si vous avez vraiment besoin d'une liste de pointeurs, envisagez d'utiliser des conteneurs spéciaux ( boost :: ptr_list ) ou d'y stocker des pointeurs intelligents ( boost :: shared_ptr ). Pour empêcher les objets de sortir de la portée après leur retour de fonction, vous devez les allouer de manière dynamique avec l'opérateur new.

La réponse acceptée n’est pas correcte. Dans la fonction

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

les objets nouvellement alloués sont affectés à des variables locales. Ils n’affectent pas les valeurs des pointeurs de la fonction appelante.

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;
}

Ce dont vous avez besoin est:

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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top