2011-12-14 13 views
13

हाल ही में मैंने एक डेवलपर के रूप में गूंगा है, इसलिए मैंने डुबकी ली, सी ++ पुस्तक प्राप्त की और सीखने के तरीके को ठीक से कैसे करना है। मेरे सिर में, मुझे पता है कि मैं क्या करना चाहता हूं। मैं प्रभावी रूप से Interface चाहता हूं कि विरासत में, अधिलेखित किया जाना चाहिए (यदि यह संभव है?)। अब तक, मैं निम्नलिखित है:सी ++ अमूर्त बेस क्लास कन्स्ट्रक्टर/विनाशक - सामान्य शुद्धता

class ICommand{ 

public: 
    // Virtual constructor. Needs to take a name as parameter 
    //virtual ICommand(char*) =0; 
    // Virtual destructor, prevents memory leaks by forcing clean up on derived classes? 
    //virtual ~ICommand() =0; 
    virtual void CallMe() =0; 
    virtual void CallMe2() =0; 
}; 

class MyCommand : public ICommand 
{ 
public: 
    // Is this correct? 
    MyCommand(char* Name) { /* do stuff */ } 
    virtual void CallMe() {} 
    virtual void CallMe2() {} 
}; 

मैं जानबूझ कर छोड़ दिया है मैं कैसे लगता है निर्माता/नाशक के ICommand में लागू किया जाना चाहिए। मुझे पता है कि क्या मैं टिप्पणियां हटाता हूं, यह संकलित नहीं होगा। कृपया सकता है किसी को:

  1. मुझे दिखाएं कि निर्माता/नाशक के घोषित करने के लिए ICommand में और कैसे वे MyCommand
  2. में इस्तेमाल किया जा के लिए होती हैं मैं चीजों को सही ढंग से ICommand में सेट ताकि MyCommandCallMe और CallMe2 ओवरराइड चाहिए है ।

मुझे आशा है कि मैं वास्तव में सरल कुछ याद नहीं है ...

+1

असल में आपको 'std :: string' का उपयोग करना चाहिए और विनाशक '{}' होगा। कन्स्ट्रक्टर प्रारंभकर्ता सूची के बारे में भी जानें, और विचार करें कि आपको 'कॉन्स्ट char *' नहीं लेना चाहिए। – UncleBens

उत्तर

20

सी ++ आभासी निर्माताओं के लिए अनुमति नहीं है। एक साधारण कार्यान्वयन (आभासी निर्माता के बिना) कुछ इस तरह दिखेगा:

class ICommand { 
public: 
    virtual ~ICommand() = 0; 
    virtual void callMe() = 0; 
    virtual void callMe2() = 0; 
}; 

ICommand::~ICommand() { } // all destructors must exist 

ध्यान दें कि यहां तक ​​कि एक शुद्ध आभासी नाशक में परिभाषित किया जा must

एक ठोस कार्यान्वयन वास्तव में अपने उदाहरण जैसा दिखाई देगा:

class MyCommand : public ICommand { 
public: 
    virtual void callMe() { } 
    virtual void callMe2() { } 
}; 

आप निर्माता के लिए options की एक जोड़ी है।

class MyCommand : public ICommand { 
public: 
    MyCommand(const std::string& name) : ICommand(name) { } 
    virtual void callMe() { } 
    virtual void callMe2() { } 
}; 
:

#include <string> 

class ICommand { 
private: 
    const std::string name; 
    ICommand(); 
public: 
    ICommand(const std::string& name) : name(name) { } 
    virtual ~ICommand() = 0; 
    virtual void callMe() = 0; 
    virtual void callMe2() = 0; 
}; 

ICommand::~ICommand() { } // all destructors must exist 

एक ठोस कार्यान्वयन अब कुछ इस तरह दिखेगा: एक विकल्प, ICommand के लिए डिफ़ॉल्ट निर्माता को निष्क्रिय करने के लिए इतना है कि उपवर्गों होगा एक निर्माता है कि आपके ICommand निर्माता कॉल लागू करने के लिए है

+1

"सी ++ वर्चुअल कंस्ट्रक्टर के लिए अनुमति नहीं देता है" मुझे यकीन नहीं है कि यह सही शब्द है। वर्चुअल कन्स्ट्रक्टर का क्या अर्थ होगा, अगर कुछ भाषा इसे लागू करना है? (ध्यान दें कि मैं वास्तविक रचनाकारों के बारे में बात कर रहा हूं, कन्स्ट्रक्टर-जैसी फ़ंक्शंस नहीं, और केवल स्थिर भाषाओं का जिक्र कर रहा हूं।) –

+0

@ पॉलमंटा डेल्फी में वर्चुअल कंस्ट्रक्टर हैं, जो कारखाने की तरह काम करते हैं लेकिन निर्मित ऑब्जेक्ट का प्रकार तय किया जाता है रन-टाइम (आईआईआरसी) –

+0

मैं आभासी कन्स्ट्रक्टर की ओपी की परिभाषा का उपयोग कर रहा हूं, जो सामान्य शुद्ध आभासी सदस्य कार्यों के समान * आवश्यक फ़ंक्शन * है। इस मामले में, कुछ ऐसा जो उप-वर्गों को एक कन्स्ट्रक्टर का उपयोग करने के लिए मजबूर करता है जिसमें "नाम" पैरामीटर शामिल होता है। मैं मानता हूं कि "आभासी कन्स्ट्रक्टर" तकनीकी रूप से समझ में नहीं आता है। –