2013-01-31 111 views
13

मैं एक आधार वर्गशुद्ध वर्चुअल फ़ंक्शंस के बिना सी ++ अमूर्त वर्ग?

class ShapeF 
{ 
public: 
    ShapeF(); 
    virtual ~ShapeF(); 

    inline void SetPosition(const Vector2& inPosition) { mPosition.Set(inPosition); } 

protected: 
    Vector2 mPosition; 
} 
जाहिर है कुछ ommitied कोड के साथ

है, लेकिन आप बात समझ। मैं एक टेम्पलेट के रूप में उपयोग करते हैं, और कुछ मज़ा (ommited) enums के साथ, एक तरह से मैं आकार किस तरह का उपयोग कर रहा हूँ

class RotatedRectangleF : public ShapeF 
{ 
public: 
    RotatedRectangleF(); 
    virtual ~RotatedRectangleF(); 
protected: 
    float mWidth; 
    float mHeight; 
    float mRotation; 
} 

ShapeF स्थिति के साथ अपने काम करता है, और एक enum कि क्या परिभाषित करता है निर्धारित करने के लिए प्रकार है। इसमें एक्सेसर्स और म्यूटेटर हैं, लेकिन कोई तरीका नहीं है।

क्या मैं आकार को एक सार वर्ग बना सकता हूं, यह सुनिश्चित करने के लिए कि कोई भी आकार की वस्तु का प्रयास नहीं करता है और आकार को तुरंत चालू करता है?

आम तौर पर, इस ShapeF

//ShapeF.h 
virtual void Collides(const ShapeF& inShape) = 0; 

हालांकि, मैं वर्तमान में एक अलग वर्ग में टकराव के साथ काम कर रहा हूँ के भीतर एक शुद्ध आभासी समारोह होने से संभव है। मैं सबकुछ ऊपर ले जा सकता हूं, लेकिन मुझे आश्चर्य है कि क्लास सार बनाने का कोई तरीका है .. शुद्ध वर्चुअल फ़ंक्शंस के बिना।

+0

आप टैगिंग (enum) और कास्टिंग के साथ गतिशील प्रेषण reimplement करने की कोशिश कर रहे हैं ... कि भविष्य में जल्द ही एक दर्द हो जाएगा का उपयोग करें। मैं डिजाइन पर पुनर्विचार करता हूं। –

+0

@ डेविडरोड्रिगुएज़-ड्राईबीस मैंने पाया कि यह सबसे आसान तरीका था, सबकुछ स्थिर है। अगर मैं फिर से डिज़ाइन करना चाहता था, तो मैं आकार के सभी को पूरी तरह से हटा दूंगा, और प्रत्येक आकार का अपना स्वयं का व्यक्ति होगा। जब तक आप एक अलग सुझाव नहीं था? – MintyAnt

उत्तर

39

आप घोषणा कर सकता है, और, एक शुद्ध आभासी नाशक लागू:

class ShapeF 
{ 
public: 
    virtual ~ShapeF() = 0; 
    ... 
}; 

ShapeF::~ShapeF() {} 

यह क्या आपके पास पहले से एक छोटे से कदम है, और सीधे instantiated होने से ShapeF कर पाएगा। व्युत्पन्न कक्षाओं को बदलने की आवश्यकता नहीं होगी।

+3

त्वरित प्रश्न - 'शुद्ध आभासी 'के रूप में घोषित होने पर' ~ आकार' को लागू करने की आवश्यकता क्यों है? –

+0

धन्यवाद, यह पूरी तरह से काम करता है। कोई विचार क्यों यह काम करता है? एक शुद्ध आभासी परिभाषित नहीं किया जा सकता है, मैंने सोचा। – MintyAnt

+4

इसे परिभाषित किया जाना है, या व्युत्पन्न कक्षाएं अपनी बेस कक्षा को नष्ट नहीं कर सकती हैं। किसी भी शुद्ध वर्चुअल फ़ंक्शन को परिभाषित किया जा सकता है, जो व्युत्पन्न कक्षाओं को उन्हें प्रतिनिधि करने की अनुमति देता है। –

18

एक संरक्षित निर्माता

+0

+1, विनाशक 'संरक्षित' और गैर-आभासी होना चाहिए। एक कोने केस है जहां यह समस्या का समाधान नहीं करता है, यदि 'आकार' 'नया '-ed है और कभी भी' हटाएं 'नहीं है (लेकिन यह स्वयं में एक बग है) –

+0

@ डेविडरोड्रिगुएज़-ड्राईबीस विनाशक को संरक्षित क्यों किया जाना चाहिए ? यदि यह संरक्षित है, तो आप ऑब्जेक्ट को हटा नहीं सकते हैं। –

+0

@JamesKanze: मुझे लगता है * चाहिए * एक मजबूत शब्द का थोड़ा सा होना चाहिए। मुझे यह एहसास है कि विनाशक 'आभासी' का एकमात्र कारण है कि * हमेशा * विनाशक आभासी बनाने की सिफारिश का पालन करना है यदि प्रकार व्युत्पन्न किया गया है।विनाशक 'संरक्षित' बनाना एक ही अंतर्निहित मुद्दा हल करता है और तत्काल नहीं होने की समस्या का समाधान प्रदान करता है (कम से कम ढेर में, और ढेर में जब तक कि आप स्मृति रिसाव से खुश न हों :) किसी भी दर पर मेरा अनुभव यह है कि पूरा डिजाइन की पुनरीक्षा की जानी चाहिए (जैसा कि मैंने प्रश्न पर टिप्पणी में उल्लेख किया है) –