2012-08-07 17 views
26

Ho la mia funzione e sto riempiendo targetBubble lì, ma non è stato riempito dopo aver chiamato questa funzione, ma so che è stata compilata in questa funzione perché ho lì il codice di uscita.La funzione non cambia il puntatore passato C++

bool clickOnBubble(sf::Vector2i & mousePos, std::vector<Bubble *> bubbles, Bubble * targetBubble) { 
    targetBubble = bubbles[i]; 
} 

E sto passando il puntatore come questo

Bubble * targetBubble = NULL; 
clickOnBubble(mousePos, bubbles, targetBubble); 

Perché non funziona per favore? Grazie

risposta

61

Perché stai passando una copia del puntatore. Per cambiare il puntatore avete bisogno di qualcosa di simile:

void foo(int **ptr) //pointer to pointer 
{ 
    *ptr = new int[10]; //just for example, use RAII in a real world 
} 

o

void bar(int *& ptr) //reference to pointer (a bit confusing look) 
{ 
    ptr = new int[10]; 
} 
+0

Ma quando provo il vostro approch crash su questa linea '* targetBubble = bolle [i],' e io sto passando argomento come questo 'clickOnBubble (mousePos, bubbles, e targetBubble);' – c0ntrol

+0

@ user1295618: quale errore vedi? Forse non rientra nell'intervallo – Andrew

+0

Errore di segmentazione – c0ntrol

6

Non è possibile cambiare il puntatore a meno che non si passa di (non const) di riferimento o come un doppio puntatore. Passando per valore si fa una copia dell'oggetto e le eventuali modifiche all'oggetto vengono apportate alla copia, non all'oggetto. È possibile modificare l'oggetto a cui punta il puntatore, ma non il puntatore stesso se si passa per valore.

Avere una lettura di questa domanda per aiutare a capire le differenze in modo più dettagliato When to pass by reference and when to pass by pointer in C++?

19

si sta passando il puntatore per valore.

Passare un riferimento al puntatore se si desidera aggiornarlo.

bool clickOnBubble(sf::Vector2i& mousePos, std::vector<Bubble *> bubbles, Bubble *& t) 
+6

+1. La prima risposta che fa bene nel contesto del C++.Le risposte che suggeriscono puntatori doppiamente indiretti sono il vecchio modo C di farlo. – paxdiablo

14

se si scrive

int b = 0; 
foo(b); 

int foo(int a) 
{ 
    a = 1; 
} 

non si cambia 'b', perché a è una copia di b

se si desidera cambiare b si avrebbe bisogno di passare l'indirizzo di B

int b = 0; 
foo(&b); 

int foo(int *a) 
{ 
    *a = 1; 
} 

stesso vale per i puntatori:

int* b = 0; 
foo(b); 

int foo(int* a) 
{ 
    a = malloc(10); // here you are just changing 
        // what the copy of b is pointing to, 
        // not what b is pointing to 
} 

modo per cambiare in cui i punti B per passare all'indirizzo:

int* b = 0; 
foo(&b); 

int foo(int** a) 
{ 
    *a = 1; // here you changing what b is pointing to 
} 

hth

Problemi correlati