Pergunta

Eu estou tentando criar uma lista de links, mas estou tendo problemas para criar objetos dentro de uma função e atribuir ponteiros para seus endereços, desde que eu acredito que eles saem de escopo quando a função sai. Isso é verdade? E, em caso afirmativo, como posso criar um objeto fora do principal e ainda usá-lo?

Foi útil?

Solução

Criar os objetos com o novo operador. ie

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

Outras dicas

Você está correto, variáveis ??locais vai sair do escopo no final do bloco de função. Você precisa criar ponteiros para os objetos e alocá-los com nova . E não se esqueça de excluir o objeto quando você removê-lo da sua lista.

Se você não quer lidar com as dificuldades e os erros que vêm com ponteiros, consulte boost :: shared_ptr .

usar o novo operador:

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

Preste atenção à exclusão de objeto quando sua lista é destruída.

Por que você não armazenar objetos (não ponteiros para objetos) na lista? Criador-função retornará objeto.

Se você realmente lista de ponteiros precisa considerar o uso de recipientes de lista ponteiro especiais (boost::ptr_list) ou armazenar ponteiros inteligentes nele (boost::shared_ptr). Para evitar objetos que vão fora do escopo após retornar de função, você precisa alocá-los dinamicamente com o operador de novo.

A resposta aceita não está certo. Na função

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

o objeto recém-alocado são atribuídos a variáveis ??locais. Elas não afetam os valores dos ponteiros na função de chamada.

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

O que você precisa é:

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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top