Passando uma classe de objecto a uma função (provavelmente por não ponteiro de referência) C ++

StackOverflow https://stackoverflow.com/questions/251325

  •  05-07-2019
  •  | 
  •  

Pergunta

Então, digamos que eu tenho duas funções diferentes. Um deles é uma parte da classe BST, é apenas uma função auxiliar que irá chamar essa função Class. Vou enumerá-los aqui.

sieve(BST<T>* t, int n);

esta função é chamada assim: peneira (T, N), o objecto é chamado de BST t;

Eu vou estar usando a função de classe de remoção dentro da função peneira para retirar objetos específicos. Eu não tenho certeza que o meu protótipo para esta função básica deve ser semelhante? Fazendo isso:

sieve(BST<int> t, int n)

O que acontece aqui é tudo compila bem, mas quando t.remove função é chamada não vejo resultados reais. Estou assumindo porque é apenas a criação de uma cópia ou um outro objeto t todo, em vez de passar a um da minha função main ().

Se eu chamar a função remove (t.remove (valor)) na minha função principal, onde o objeto original foi criado ele remove tudo corretamente. Uma vez que eu começar a fazer isso através da minha função peneira vejo nenhuma mudança quando eu re imprimi-lo de minha função principal. Assim, a minha principal função é algo como isto:

int main ()
{
   int n,
       i,
       len;

   BST<int> t;

   cin >> n;
   vector<int> v(n);

   srand(1);

   for (i = 0; i < n; i++)
      v[i] = rand() % n;

   for (i = 0; i < n; i++)
      t.insert(v[i]);
       print_stat(t);
   t.inOrder(print_data);



   sieve(v,t,n);
   print_stat(t);
   t.inOrder(print_data);
   return 0;
}

Assim, meus resultados acabam sendo o mesmo, apesar de minhas declarações de depuração dentro das funções mostrar que está realmente apagar alguma coisa. Eu estou supondo que onde estou indo errado é como eu estou passando o objeto t para a função.

Foi útil?

Solução

sieve(BST<int>& t, int n)

Os especifica & passando por referência em vez do valor. : -)

Outras dicas

Se bem entendi o seu problema, você deve usar

BST t;    
sieve(BST<T> *t, int n);

e invocá-la como:

sieve(&t,n)

passando o ponteiro para o objeto t

ou

BST t; 
sieve(BST<T> &t, int n);

e invocá-la como:

sieve(t,n)

passar a referência para o objeto t

A assinatura:

/* missing return type */ sieve<BST<int> t, int n);

será, de fato, fazer uma cópia do BST<int> passado para sieve(). Portanto, as alterações feitas a ele vai ser jogado fora (a menos que você retornar uma cópia do mesmo).

Você provavelmente vai querer algo como:

void sieve<BST<int> & t, int n);

que passa em uma referência, de modo que quaisquer modificações que você faz para t dentro do método são feitas para o objeto que você passou no (não uma cópia).

Depois de conseguir isso para baixo e compreendê-lo, você provavelmente vai querer fazer a função sieve() um "modelo de função" para que ele possa tomar um BST<> contendo qualquer tipo.

O que acontece aqui é tudo compila bem, mas quando t.remove função é chamada não vejo resultados reais. Estou assumindo porque é apenas a criação de uma cópia ou um outro objeto t todo, em vez de passar a um da minha função main ().

Correto. Isso é exatamente o que acontece, porque em parâmetros C ++ são passados ??para funcitons por valor. Passando uma referência ou um ponteiro vai resolver o seu problema. Usando uma referência é mais limpo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top