2012-08-07 17 views
26

Tengo mi función y estoy llenando targetBubble allí, pero no está lleno después de llamar a esta función, pero sé que se completó esta función porque tengo el código de salida.La función no cambia el puntero pasado C++

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

Y estoy pasando el puntero como esto

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

¿Por qué no está funcionando, por favor? Gracias

Respuesta

61

Porque está pasando una copia del puntero. Para cambiar el puntero se necesita algo como esto:

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

Pero cuando trato de su approch que choque en esta línea '* targetBubble = burbujas [i];' y yo estoy pasando un argumento como este 'clickOnBubble (mousePos, bubbles, & targetBubble);' – c0ntrol

+0

@ user1295618: ¿qué error ves? Posiblemente estoy fuera del rango – Andrew

+0

Error de segmentación – c0ntrol

6

No se puede cambiar el puntero a menos que se pasa por referencia (no const) o como un puntero doble. Pasar por valor hace una copia del objeto y cualquier cambio en el objeto se realiza en la copia, no en el objeto. Puede cambiar el objeto al que apunta el puntero, pero no el puntero si pasa por valor.

tener una lectura de esta pregunta para ayudar a entender las diferencias con más detalle When to pass by reference and when to pass by pointer in C++?

19

está de paso por el puntero de valor.

Pase una referencia al puntero si desea que se actualice.

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

+1. La primera respuesta que lo hace bien en el contexto de C++.Las respuestas que sugieren punteros doblemente indirectos son la vieja forma de hacerlo. – paxdiablo

14

si se escribe

int b = 0; 
foo(b); 

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

no cambia 'b', ya que a es una copia de b

si desea cambiar b que tendría que pasar la dirección de b

int b = 0; 
foo(&b); 

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

mismo ocurre con los punteros:

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 
} 

lo que para cambiar donde b puntos para pasar la dirección:

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

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

hth

Cuestiones relacionadas