2012-08-07 10 views
26

Mam swoją funkcję i zapełniam tam targetBubble, ale nie jest ona wypełniona po wywołaniu tej funkcji, ale wiem, że została ona wypełniona tą funkcją, ponieważ mam tam kod wyjściowy.Funkcja nie zmienia przekazanego wskaźnika C++

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

I m przechodzącą wskaźnik jak ten

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

Dlaczego to nie działa proszę? Dzięki

Odpowiedz

61

Ponieważ przekazujesz kopię wskaźnika. Aby zmienić wskaźnik trzeba coś takiego:

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

lub

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

Ale gdy próbuję swoją approch zawiesisz na tej linii '* targetBubble = baniek [I];' a ja mijam argument taki jak ten 'clickOnBubble (mousePos, bubbles, & targetBubble);' – c0ntrol

+0

@ user1295618: jaki błąd widzisz? Prawdopodobnie jest poza zasięgiem – Andrew

+0

Błąd segmentacji – c0ntrol

6

Nie można zmienić wskaźnik, chyba że przechodzą go (bez const) odniesienia lub jako podwójny wskaźnik. Przekazywanie według wartości powoduje, że kopia obiektu i wszelkie zmiany w obiekcie są wprowadzane do kopii, a nie do obiektu. Możesz zmienić obiekt wskazywany przez wskaźnik, ale nie sam wskaźnik, jeśli przechodzisz przez wartość.

Mają lektury tego pytania, aby pomóc zrozumieć różnice bardziej szczegółowo When to pass by reference and when to pass by pointer in C++?

19

są przechodzącą wskaźnik przez wartość.

Przekaż odniesienie do wskaźnika, jeśli chcesz go zaktualizować.

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

+1. Pierwsza odpowiedź, która sprawdza się w kontekście C++.Odpowiedzi sugerujące wskaźniki podwójnie pośrednie są starym sposobem C tego. – paxdiablo

14

jeśli piszesz

int b = 0; 
foo(b); 

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

nie zmieniać „b”, ponieważ jest kopią b

jeśli chcesz zmienić b trzeba by przekazać adres b

int b = 0; 
foo(&b); 

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

samo dotyczy wskaźników:

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 
} 

tak zmienić, gdzie punkty b przekazać adres:

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

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

HTH

Powiązane problemy