Passerer en klasse objekt til en funksjon (sannsynligvis ved pekeren ikke referansen) C ++

stemmer
1

Så la oss si jeg har to forskjellige funksjoner. Den ene er en del av BST klassen, man er bare en hjelper funksjon som vil kalle på at klasse funksjon. Jeg vil føre dem ut her.

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

Denne funksjonen kalles slik: sikt (t, n) gjenstanden kalles BST t;

Jeg kommer til å være med klassen fjerner funksjon i sil funksjonen til å fjerne spesifikke objekter. Jeg er ikke sikker på hva min prototype for denne grunnleggende funksjonen skal se ut? Gjør dette:

sieve(BST<int> t, int n)

Hva som skjer her er alt kompilerer helt fint, men når t.remove funksjonen kalles jeg ser ingen faktiske resultater. Jeg antar fordi det er bare å lage en kopi eller en helt annen t objekt i stedet for å føre en fra min main () -funksjonen.

Hvis jeg kaller fjerne funksjonen (t.remove (verdi)) i min viktigste funksjon hvor den opprinnelige objektet ble opprettet den fjerner alt riktig. Når jeg begynne å gjøre det gjennom min sil funksjon jeg ser ingen endring når jeg re skrive den ut fra min hovedfunksjon. Så mitt viktigste funksjonen ser omtrent slik ut:

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

Så mine resultater ende opp som den samme, selv om mine debug uttalelser i funksjonene viser det faktisk sletter noe. Jeg gjetter hvor jeg går galt er hvordan jeg passerer t objekt på funksjonen.

Publisert på 30/10/2008 klokken 18:58
kilden bruker
På andre språk...                            


4 svar

stemmer
3

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

De &angir passerer henvisning snarere enn verdi. :-)

Svarte 30/10/2008 kl. 19:03
kilden bruker

stemmer
2

Signaturen:

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

vil faktisk lage en kopi av den BST<int>som ble vedtatt i å sieve(). Så noen endringer du gjør det vil bli kastet bort (med mindre du returnerer en kopi av det).

Du har sannsynligvis vil ha noe sånt som:

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

som passerer i en referanse, slik at eventuelle endringer du gjør tinne fremgangsmåten er gjort til gjenstand at du har bestått i (ikke en kopi).

Når du får det ned og forstår det, vil du sannsynligvis ønske å gjøre sieve()funksjonen en "funksjon mal", slik at det kan ta en BST<>som inneholder alle typer.

Svarte 30/10/2008 kl. 19:06
kilden bruker

stemmer
3

Hvis jeg forstår riktig problemet, bør du bruke

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

og påkalle den som:

sieve(&t,n)

å føre pekeren til tobjektet

ELLER

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

og påkalle den som:

sieve(t,n)

passerer referanse til tobjektet

Svarte 30/10/2008 kl. 19:06
kilden bruker

stemmer
1

Hva som skjer her er alt kompilerer helt fint, men når t.remove funksjonen kalles jeg ser ingen faktiske resultater. Jeg antar fordi det er bare å lage en kopi eller en helt annen t objekt i stedet for å føre en fra min main () -funksjonen.

Riktig. Det er nøyaktig hva som skjer, fordi i C ++ parametere sendes til funcitons av verdi. Passerer en referanse eller en peker vil løse problemet. Ved hjelp av en referanse er renere.

Svarte 30/10/2008 kl. 19:08
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more