2009-09-14 8 views
55

कल्पना कीजिए कि मेरे पास एक सी ++ कक्षा फू और एक क्लास बार है जिसे एक निर्माता के साथ बनाया जाना है जिसमें एक फू पॉइंटर पारित किया गया है, और यह सूचक बार उदाहरण जीवन चक्र में अपरिवर्तनीय रहने के लिए है। ऐसा करने का सही तरीका क्या है?कन्स्ट्रक्टर में एक कॉन्स फील्ड कैसे शुरू करें?

वास्तव में, मैंने सोचा कि मैं नीचे दिए गए कोड प्रकार लिख सकते हैं, लेकिन यह संकलन नहीं है ..

class Foo; 

class Bar { 
public: 
    Foo * const foo; 
    Bar(Foo* foo) { 
     this->foo = foo; 
    } 
}; 

class Foo { 
public: 
    int a; 
}; 

कोई भी सुझाव का स्वागत है।

उत्तर

64

आप एक प्रारंभकर्ता सूची में क्या करने की जरूरत:

Bar(Foo* _foo) : foo(_foo) { 
} 

(ध्यान दें कि मैं भेजे चर नाम दिया भ्रम से बचने के।)

+3

+1, हालांकि मैं हाल ही में यहाँ सीखा है कि चर:

Bar(Foo* foo) : foo(foo) { } 

एक तरफ ध्यान दें, यदि आप कभी नहीं बदलेगा क्या foo बिंदुओं पर, उस में एक संदर्भ के रूप में पारित अब अंडरस्कोर से शुरू * आधिकारिक रूप से * आरक्षित ;-) –

+1

केवल तभी जब वे एक अपरकेस अक्षर के बाद होते हैं। – GManNickG

+1

या नामस्थान क्षेत्र में हैं! या उसके बाद एक और अंडरस्कोर किया जाता है। तो हाँ, यह इस मामले में तकनीकी रूप से कानूनी है, लेकिन मैं कहूंगा कि यह सिर्फ इतना नाटक करना आसान है कि वे आरक्षित हैं, और उनका उपयोग नहीं करते हैं। :) – jalf

2

एक संदर्भ का उपयोग करें:

Foo& foo; 
Bar(Foo& f) : foo(f) { } 

आप तो को Bar में आसानी से संदर्भित कर सकते हैं:

foo.doSomething(); 
+1

मैं "ऋणात्मक" के रूप में वोट देता हूं क्योंकि यदि यह एकमात्र उत्तर था, तो मैंने गलत तरीके से सोचा था कि संदर्भ का उपयोग करना इसे हासिल करने का एकमात्र तरीका था, जबकि इसके बजाय अन्य उत्तर दिखाता है, चाल प्रारंभकर्ता सूची है। – puccio

+0

आईएमएचओ, संदर्भ इस मामले में बहुत अधिक सुरुचिपूर्ण हैं क्योंकि पॉइंटर को प्रारंभ होने के बाद बिल्कुल नहीं बदला जाना चाहिए :) – AraK

+1

लेकिन प्रश्न यह था कि पॉइंटर को कैसे प्रारंभ किया जाए। –

0

कोशिश: Bar(Foo* xfoo) : foo(xfoo) {}

12

स्थिरांक के सदस्यों और अन्य विशेष मामलों (जैसे माता-पिता वर्ग) शुरु कर रहा है, प्रारंभकर्ता सूची

class Foo { 
private: 
    const int data; 
public: 
    Foo(int x) : data(x) {} 
}; 

या, उसी प्रकार में पूरा किया जा सकता माता पिता आरंभीकरण के लिए

class Foo { 
private: 
    int data; 
public: 
    Foo(int x) : data(x) {} 
}; 

class Bar : Foo { 
public: 
    Bar(int x) : Foo(x) {} 
}; 
5

आपको प्रारंभकर्ता सूची में foo प्रारंभ करने की आवश्यकता है।

class Bar { 
    Foo* const foo; 
    public: 
    Bar(Foo* f) : foo(f) {...} 
}; 
16

मुझे विश्वास है कि आपको इसे प्रारंभकर्ता में करना होगा। उदाहरण के लिए:

Foo& foo; 

Bar(Foo& foo) : foo(foo) { 
} 
+2

+1: संदर्भ का उपयोग भी आप चाहते हैं, संकेत है जहाँ आप की जरूरत है। –

संबंधित मुद्दे