2012-08-07 6 views
26

नहीं बदलता है मेरे पास मेरा फ़ंक्शन है और मैं targetBubble भर रहा हूं, लेकिन यह इस फ़ंक्शन को कॉल करने के बाद भर नहीं गया है, लेकिन मुझे पता है कि यह इस फ़ंक्शन में भर गया है क्योंकि मेरे पास आउटपुट कोड है।फ़ंक्शन पास पॉइंटर C++

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

और मैं इस

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

तरह सूचक गुजर रहा यह क्यों कृपया काम नहीं कर रहा? धन्यवाद

उत्तर

61

क्योंकि आप सूचक की एक प्रति उत्तीर्ण कर रहे हैं।

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

या

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

लेकिन जब मैं अपने approch कोशिश यह इस लाइन पर दुर्घटना '* targetBubble = बुलबुले [i];' और मैं इस क्लिक पर तर्क पारित कर रहा हूं 'क्लिकऑनबबल (माउसपॉस, बुलबुले, और लक्ष्यबबल); ' – c0ntrol

+0

@ user1295618: आप क्या त्रुटि देखते हैं? संभवतः मैं – Andrew

+0

सेगमेंटेशन गलती – c0ntrol

6

आप सूचक को बदल नहीं सकते जब तक आप इसे (गैर स्थिरांक) संदर्भ द्वारा या एक डबल सूचक के रूप में पारित: सूचक को बदलने के लिए आप कुछ इस तरह की जरूरत है। मूल्य से गुजरने से ऑब्जेक्ट की एक प्रति बन जाती है और ऑब्जेक्ट में कोई भी परिवर्तन प्रतिलिपि में किया जाता है, ऑब्जेक्ट नहीं। आप उस ऑब्जेक्ट को बदल सकते हैं जो पॉइंटर इंगित करता है, लेकिन यदि आप मूल्य से गुजरते हैं तो पॉइंटर स्वयं नहीं।

इस सवाल का एक पढ़ने में मदद करने के When to pass by reference and when to pass by pointer in C++?

19

आप मान द्वारा सूचक से गुजर रहे हैं और अधिक विस्तार में अंतर को समझने लो।

पॉइंट के संदर्भ में यदि आप इसे अपडेट करना चाहते हैं तो पास करें।

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

+1 कोई समस्या नहीं होगी। पहला जवाब जो इसे C++ के संदर्भ में सही बनाता है।उत्तर देने का जवाब दोगुना अप्रत्यक्ष पॉइंटर्स ऐसा करने का पुराना सी तरीका है। – paxdiablo

14

यदि आप लिखना

int b = 0; 
foo(b); 

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

आप 'बी' में परिवर्तन नहीं करते क्योंकि एक ख की एक प्रति है

आप ख आप ख का पता पारित करने के लिए की आवश्यकता होगी बदलना चाहते हैं

int b = 0; 
foo(&b); 

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

एक ही संकेत के लिए चला जाता है:

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 
} 

इसलिए जहां ख अंक पता पारित करने के लिए बदलने के लिए:

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

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

hth