2011-10-05 33 views
12

ओओपी के कोने पत्थरों में से एक इसे बार-बार दोहराने के बजाय कोड का पुन: उपयोग कर रहा है। इस प्रकार, आपकी परियोजनाएं कम हो जाती हैं और अधिक पठनीय हो जाती हैं।पुन: प्रयोज्य कन्स्ट्रक्टर सी ++

सी ++ आपको कोड को दोहराने के बजाय विधियों का पुन: उपयोग करने के लिए आवश्यक सभी टूल्स देता है। हालांकि जब रचनाकारों की बात आती है तो मुझे नहीं पता कि उनका पुन: उपयोग कैसे किया जाए।

मैं नहीं विरासत की बात कर रहा हूं या पिता को संदेश कैसे भेजूं। मैं कक्षा के निर्माता के पुन: उपयोग करने के बारे में बात कर रहा हूं। ,

public Foo() { 
    this(0,0,0);//Not needed in this case, just to clarify 
} 

public Foo(Foo f){ 
    this(f.getA(), f.getB(), f.getC()); 
} 

public Foo(int a, int b, int c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

मेरा प्रश्न है वहाँ सी में किसी भी Syntaxis ++ कि आप ऐसा करने की अनुमति देता है:

जावा में सादृश्य कुछ इस तरह है?

उत्तर

8

This is possible with recently published C++11, लेकिन कोई सी ++ संकलक अभी तक इस सुविधा को लागू नहीं करता है।

+0

यह बजना के डेवलपर की सूची पर कई बार लाया गया है। जहां तक ​​मुझे पता है कि इसे कम प्राथमिकता माना जाता है क्योंकि उदाहरण के लिए यह लैम्बडास की तुलना में जीवन परिवर्तक नहीं है। बेशक, अगर किसी ने वास्तव में इसे उपयोगी माना, तो क्लेंग और जीसीसी दोनों खुले स्रोत हैं :) –

+0

यह उत्तर एक अद्यतन का उपयोग कर सकता है। –

6

सी ++ 11 ने कन्स्ट्रक्टर प्रतिनिधिमंडल और कन्स्ट्रक्टर विरासत को जोड़ा है। आपको एक कंपाइलर प्राप्त करने की आवश्यकता होगी जो यद्यपि इसका समर्थन करता है।

कंस्ट्रक्टर्स के वारिस के लिए, एक का उपयोग कर-घोषणा की जरूरत है:

class Base { ... }; 

class Derived : public Base 
{ 
    using Base::Base; 
}; 

, प्रतिनिधि ctor-प्रारंभकर्ता उपयोग करें, लेकिन सभी एक ही कक्षा में एक और निर्माता निर्दिष्ट करते हैं, किसी भी subobjects के बजाय (करने के लिए बेस और सदस्य सबोबजेक्ट्स को कन्स्ट्रक्टर द्वारा शुरू किया जाएगा):

class Another : public Base 
{ 
    int member; 
    Another(int x) 
     : Base(), member(x) // non-delegating constructor initializes sub-objects 
    {} 


    Another(void) 
     : Another(5) // delegates -- other constructor takes care of Base and member 
    {} 
}; 

और सही अग्रेषण भी काम में आ सकता है।

+1

यह अब सामान्य रूप से उपलब्ध होना चाहिए, शायद इसे मौजूदा संकलक के साथ समाधान को इंगित करने के लिए स्वीकार्य उत्तर ... – moodboom

11

अन्य ने पहले ही सी ++ 11 के बारे में उत्तर दिया है, लेकिन सी ++ 03 के लिए एक संभावित कार्यवाही है: आवश्यक कन्स्ट्रक्टर के साथ बेस क्लास का उपयोग करना।

struct foo_base { 
    foo_base(int a, int b, int c) : a(a), b(b), c(c) { } 
    int a, b, c; 
}; 

struct foo : foo_base { 
    foo() : foo_base(0, 0, 0) { } 
    foo(const foo& other) : foo_base(other.a, other.b, other.c) { } 
    foo(int a, int b, int c) : foo_base(a, b, c) { } 
}; 

बेशक, आपको यह विचार करने की आवश्यकता है कि यह आपके उद्देश्यों के लिए बॉयलरप्लेट के लायक है या नहीं। कि केवल उदाहरण की सादगी की वजह से है, इस इस उदाहरण में मार से अधिक की तरह लग सकता है

class Bar{ 
pubilc:  
Foo() { 
    init(0,0,0); 
} 

Foo(const Foo &f){ 
    init(f.getA(), f.getB(), f.getC()); 
} 

Foo(int a, int b, int c) { 
    init(a,b,c); 
} 

private: 

void init(int a, int b, int c){ 
    this->a = a; 
    this->b = b; 
    this->c = c; 
} 
}; 

:

+2

+1 किया जाना चाहिए।मैंने निर्णय लेने से पहले, लिखने के लिए –

+1

+1 लिखने का फैसला किया था। –

2

आम तौर पर स्वीकार soultion वर्तमान compilers के लिए यह करने के लिए है। वास्तविक दुनिया के आवेदन में यह वास्तव में दोहराए गए कोड को कम करने के संदर्भ में लाभ लाएगा।

+0

यह कौन सी भाषा है? – Johnsyweb

+0

क्षमा करें, जावा और सी ++ कभी-कभी मेरे लिए धुंधला हो जाते हैं। मैंने अपनी पोस्ट संपादित की है ताकि यह पूरी तरह मान्य सी ++ में हो, अब यह मानते हुए कि आपके पास वैध getA(), getB(), getC() फ़ंक्शन हैं। –

+1

'this.a' अमान्य है, और कॉपी कन्स्ट्रक्टर को तर्क के रूप में कॉन्स्ट संदर्भ लेना चाहिए। –

1

ठीक सी ++ 11 आपको जो चाहिए उसे शामिल करता है।

लेकिन अपने सरल मामले एक आसान समाधान है:

/* This one is covered by providing default parameters see below. 
public Foo() { 
    this(0,0,0);//Not needed in this case, just to clarify 
} 

This is done automatically by the compiler. 
You do not need to write any code for this: 
public Foo(Foo f){ 
    this(f.getA(), f.getB(), f.getC()); 
} 
The compiler generated version actually looks like this: 
public Foo(Foo const& f) 
    : a(f.a) 
    , b(f.b) 
    , c(f.c) 
{} 



*/ 

// Now you can use all three methods and they work fine: 
public Foo(int a = 0, int b = 0, int c = 0) 
    : a(a) 
    , b(b) 
    , c(c) 
{} 

F f1;  // default construct no parameters: uses the three parameter version 
F f2(f1); // Copy constructed. Generated by the compiler. 
F f3(1,2,3); // Nomal constructor 
+0

मैं पैरामीटर के लिए डिफ़ॉल्ट मानों का उपयोग करने के खिलाफ आम तौर पर हूं, अगर आप इसका उपयोग कैसे कर सकते हैं इसके विभिन्न क्रमिकताओं को _all_ नहीं समझते हैं, यानी अब आपके पास 'Foo (int, int, int)' का उपयोग करने के लिए वास्तव में चार तरीके हैं, जो संभवतः नहीं है सही बात। –

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