2011-10-03 22 views
5

टेम्पलेट क्लास के लिए कॉपी कन्स्ट्रक्टर कैसे लिखें। इसलिए यदि टेम्पलेट पैरामीटर एक और उपयोगकर्ता परिभाषित वर्ग है तो इसकी कॉपी कन्स्ट्रक्टर भी कॉल की जाती है।टेम्पलेट क्लास कॉपी कन्स्ट्रक्टर

बाद

मेरी कक्षा

template <typename _TyV> 
class Vertex { 
public: 
    Vertex(_TyV in) : m_Label(in){ } 
    ~Vertex() { } 
    bool operator < (const Vertex & right) const { 
     return m_Label < right.m_Label; 
    } 

    bool operator == (const Vertex & right) const { 
     return m_Label == right.m_Label; 
    } 

    friend std::ostream& operator << (std::ostream& os, const Vertex& vertex) { 
     return os << vertex.m_Label;  
    } 

    _TyV getLabel() { return m_Label;} 
private: 
    _TyV m_Label; 
public: 
    VertexColor m_Color; 
protected: 
}; 
+0

क्या आप प्रतिलिपि बनाना चाहते हैं जो किसी भी 'वर्ग' को तर्क के रूप में स्वीकार कर सकता है? – iammilind

+2

@iammilind: यह एक कॉपी कन्स्ट्रक्टर नहीं होगा। –

उत्तर

3

एक मान प्रकार है मान लिया जाये कि _TyV?

सी ++ मानक सी ++ कार्यान्वयन और मानक पुस्तकालयों [सी ++ मानक 17.6.3.3 - आरक्षित नाम] द्वारा उपयोग के लिए नामों का एक सेट आरक्षित करता है। उन शामिल हैं, लेकिन तक सीमित नहीं हैं:

  • एक डबल अंडरस्कोर वाले नाम।
  • नाम जो अंडरस्कोर से शुरू होते हैं उसके बाद एक अपरकेस अक्षर होता है।
  • नाम जो वैश्विक नामस्थान पर अंडरस्कोर से शुरू होते हैं।
+0

धन्यवाद इसे ठीक करेगा। – Avinash

+0

क्या होगा अगर _TyV सूचक या संदर्भ – Avinash

+0

@Avinash: यह ठीक से काम करेगा, मुझे नहीं पता कि मैंने यह क्यों लिखा है। ठीक कर देंगे। –

2
template <typename T> 
class Vertex { 
public: 

    //this is copy-constructor 
    Vertex(const Vertex<T> &other) 
      : m_Color(other.m_Color),m_Label(other.m_Label) 
    { 
     //.. 
    } 
    //.. 
}; 

है लेकिन मुझे नहीं लगता कि आप स्पष्ट रूप से कॉपी-निर्माता परिभाषित करने की जरूरत है जब तक कि वर्ग सूचक सदस्य डेटा की क्या ज़रूरत है और आप गहरे बनाना चाहते वस्तुओं की प्रति। यदि आपके पास सूचक सदस्य डेटा नहीं है, तो संकलक द्वारा उत्पन्न डिफ़ॉल्ट प्रति-निर्माता पर्याप्त होगा। वर्ग उदाहरणों कार्यान्वयन द्वारा आरक्षित भीतर उन नामों

Vertex(Vertex const& src) 
    : m_Label(src.m_Label) 
{} 

रहे हैं नहीं, वैसे:

+0

मुझे नहीं पता कि कक्षा का उपयोग कैसे किया जाएगा। मैं इसे सामान्य बनाना चाहता हूं। – Avinash

4

या तो एक) बिल्कुल नहीं, बस संकलक द्वारा प्रदत्त डिफ़ॉल्ट पर भरोसा करते हैं; या ख) सिर्फ सदस्य की प्रतिलिपि निर्माता लागू द्वारा: यह एक एक करके प्रत्येक सदस्य एक की प्रतिलिपि निर्माता का आह्वान:

template <typename T> struct Foo 
{ 
    T var; 
    Foo(const Foo & rhs) : var(rhs.var) { } 
}; 

बिंदु पाठ्यक्रम कि संकलक द्वारा प्रदत्त डिफ़ॉल्ट प्रतिलिपि निर्माता ठीक करता है एक ही बात की है । तो चतुर सदस्य वस्तुओं से बना एक वर्ग के लिए, डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर सबसे अच्छा संभव होना चाहिए।

+0

अपना उत्तर देखने के बाद, मैं सवाल समझ गया। :) – iammilind

+0

आप सी ++ 0x में कॉपी कन्स्ट्रक्टर को स्पष्ट रूप से डिफ़ॉल्ट भी डिफॉल्ट कर सकते हैं। इसके अलावा यह आपके टेम्पलेट तर्क पर 'CopyConstructible' आवश्यकता रखता है। – pmr

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