Gå til innhold

"Global" oppdatering av et objekt sendt som argument til metode


Anbefalte innlegg

Beklager dårlig emnetittel, men klarte ikke finne på noe bedre :p

Dette spørsmålet dreier seg om Objective C, men er muligens samme teori i C++?

Greia er at jeg har en metode som tar et NSScanner objekt som argument. Det jeg vil at skal skje er at endringer gjort i objektet i metoden som mottar det, skal også gjelde i objektet i metoden som sendte det.

Et eksempel jeg vet funker med kun en int variabel i vanlig C:

void test2(int *i) {
   *i = 2;
}

void test1() {
   int i = 1;
   test2(&i)
   // i er nå lik 2
}

 

Det under er det jeg har førsøkt, men jeg får denne advarselen: "Passing argument from incompatible pointer type".

 

-(void) test2:(NSScanner *)aScanner {
   //scanneren blir oppdatert her
}

-(void) test1 {
   NSScanner *aScanner = initierer ny scannerobjekt her.

   [test2 &aScanner];

   // Endringer gjort test2 på aScanner skal gjelde videre her.
}

 

Jeg vet at dette enkelt kunne blitt gjort med en global variabel, men jeg har lest litt rundt fordi og jeg har forstått at globale variabler en styggedom som ikke burde brukes av noen, så jeg tenkte jeg skulle prøve å unngå det :) Er uansett greit å lære bare for å forstå ting litt bedre.

Lenke til kommentar
Videoannonse
Annonse

-(void) test2:(NSScanner *)aScanner {
   //scanneren blir oppdatert her
}

-(void) test1 {
   NSScanner *aScanner = initierer ny scannerobjekt her.

   [test2 &aScanner];

   // Endringer gjort test2 på aScanner skal gjelde videre her.
}

 

 

   [test2 &aScanner]; 

Her sender du peker til peker, altså av type NSScanner**, som blir feil, hvis du ikke vil e.g. gjøre slik at aScanner skal peke til et nytt objekt f.eks.

[test aScanner];

tipper jeg er rett. Hvis du vil bruke &aScanner, må du deklarere funksjonen som (NSScanner**)

  • Liker 1
Lenke til kommentar

   [test2 &aScanner]; 

Her sender du peker til peker, altså av type NSScanner**, som blir feil, hvis du ikke vil e.g. gjøre slik at aScanner skal peke til et nytt objekt f.eks.

Jeg trodde at jeg her sendte minneadressen til pekeren i metode-argumentet, og at dermed ville aScanner i test2 peke på dette minneområdet.

 

[test aScanner];

tipper jeg er rett. Hvis du vil bruke &aScanner, må du deklarere funksjonen som (NSScanner**)

Så hvis jeg vil gjøre dette riktig så må det bli som dette?:

-(void) test2:(NSScanner **)aScanner {
   [&aScanner setScanLocation:20];
}

-(void) test1 {
   NSScanner *aScanner = initierer ny scannerobjekt her.

   [test2 &aScanner];

   // Endringer gjort test2 på aScanner skal gjelde videre her.
}

 

Eller kan jeg bare gjøre som dette:

-(void) test2:(NSScanner *)aScanner {
   [aScanner setScanLocation:20];
}

-(void) test1 {
   NSScanner *aScanner = initierer ny scannerobjekt her.

   [test2 aScanner];

   // Endringer gjort test2 på aScanner skal gjelde videre her.
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...