2011-06-17 12 views
6

मेरे पास डेटा प्रकार है उदाहरण के लिए class Vector3। अब मुझे Vector3 के समान इंटरफ़ेस के साथ कई कक्षाएं बनाने की आवश्यकता है, लेकिन उच्च स्तर के अर्थात् (उदाहरण के लिए: Position, Velocity)। typedef का उपयोग करना पर्याप्त नहीं है, क्योंकि मुझे इन प्रकारों को अलग होने की आवश्यकता है ताकि उन्हें ओवरलोडिंग के लिए उपयोग किया जा सके। सी ++ 0x में मैं शायद कन्स्ट्रक्टर विरासत का उपयोग कर सकता हूं:सी ++ अर्थात् प्रकार टाइपिंग

struct Position: public Vector3 { 
    using Vector3::Vector3; 
}; 

क्या इससे कोई समस्या हो सकती है? क्या ऐसा करने का कोई बेहतर तरीका है? क्या सी ++ 0x सुविधाओं का उपयोग किए बिना इसे करना संभव है और सभी Vector3 रचनाकारों को स्पष्ट रूप से लिखना नहीं है?

+0

इस के साथ समस्या यह है कि पदों परोक्ष वैक्टर के लिए परिवर्तनीय हैं (और है कि तकनीकी तौर पर, वेक्टर अब एक आभासी नाशक क्रम में सुरक्षित रूप से प्रयोग की जाने वाली होनी चाहिए) – jalf

+0

@jalf है : क्या आभासी विनाशक वास्तव में तब भी जरूरी है जब व्युत्पन्न वर्ग कोई डेटा या विधियां नहीं जोड़ता है? –

+0

आधा: मैं अपने उत्तर में रूपांतरणों के विषय पर चर्चा करता हूं – sehe

उत्तर

5

, एक टैग struct

struct tagPosition {}; 
struct tagDirection {}; 
struct tagGeneric {}; 

namespace detail 
{ 
    template <typename Tag=tagGeneric> 
     class Vector3 
    { 
     // business as usual 
    }; 
} 

typedef detail::Vector3<tagPosition> Position; 
typedef detail::Vector3<tagDirection> Direction; 
typedef detail::Vector3<tagGeneric> Vector3; 

बोनस अंक के लिए उपयोग करने पर विचार रूपांतरण ऑपरेटरों/कंस्ट्रक्टर्स है:। आप खतरनाक तरीके से जीने के लिए आप कर सकते हैं पसंद है

template <typename Tag=tagGeneric> 
     class Vector3 
    { 
     template <typename OtherTag> 
      explicit Vector3(const Vector3<OtherTag>& rhs) { /* ... */ } 

//  template <typename OtherTag> 
//   operator Vector3<OtherTag>() const { return /* ... */ } 
    }; 

explicit कीवर्ड ड्रॉप करें, या निहित रूपांतरण ऑपरेटर सक्षम करें। इस तरह के मामलों के लिए स्पष्ट ऑपरेटरों (मुक्त कार्यों :)

परिभाषित करने के लिए

Position pos; 
Direction dir; 
Generic gen; 

dir = gen + pos; // you see why I call it 'promiscuous'? 

मैं (बजाय) की सलाह देते हैं: यह बहुत की तरह अनेक ऑपरेटर प्रस्तावों सक्षम करने के लिए सक्षम होने का 'लाभ' के लिए होता है

Position operator+(const Position& v, const Translation& d) { /* .... */ } 

इस तरह आपका वर्ग मॉडल आपके वर्गों के अर्थशास्त्र को प्रतिबिंबित करता है।

C++0x would possibly contain things to enable explicit conversion operators, IIRC:

परिवर्तित कंस्ट्रक्टर्स के मामले में, आप निर्माता स्पष्ट रूप N1592 proposal सभी रूपांतरण ऑपरेटरों को इस कीवर्ड के शब्दों में फैला है की घोषणा के द्वारा निहित रूपांतरण अक्षम कर सकते हैं। एक रूपांतरण ऑपरेटर स्पष्ट घोषित किया जाएगा कि एक अंतर्निहित रूपांतरण नहीं करेगा। इसके बजाय, प्रोग्रामर यह स्पष्ट रूप से कॉल करने के लिए होगा

+0

हो सकते हैं यदि आप गणितीय रूप से सही होना चाहते हैं, तो आपको केवल निम्नलिखित की अनुमति देनी चाहिए: स्थिति + वेक्टर = स्थिति; स्थिति - स्थिति = वेक्टर; दिशा == वेक्टर; दिशा * गति = वेग (गति 1/समय इकाइयों में _scalar_ है!)। स्थिति सख्ती से वैक्टर नहीं हैं, लेकिन एक एफ़िन स्पेस में अंक हैं। आपका "वेग * दिशा" उलझन में है - दोनों वेक्टर हैं, उनके उत्पाद का क्या अर्थ है? –

+0

@ केरेक: मेरे पास ऐसी कोई धारणा नहीं थी, और वे प्रासंगिक नहीं हैं। मेरे उदाहरण में अर्थशास्त्र को सही और गलत नहीं होना चाहिए। _ (इसके अलावा, आप पहली बार कैसे कह सकते हैं कि मेरा उदाहरण गलत है, और उसके बाद ही मुझसे पूछें कि चीजों का क्या अर्थ है? शायद दिशा परिभाषा के अनुसार एकता वेक्टर है। ध्यान दें कि नमूना यह निर्दिष्ट नहीं करता है कि दिशा ** कैसे प्राप्त हो सकती है ** वेक्टर 3 से। बस कल्पना करें कि इसके उदाहरण के लिए उचित आविष्कार हैं)। -- बस केह रहा हू! – sehe

+0

@sehe: आपने 'वेलोसिटी' एक वेक्टर बनाया है। अब वेग समय दिशा क्या संभवतः मतलब हो सकता है? बस उत्सुक! –

4

जब मैं अलग-लेकिन-समान प्रकार की जरूरत किया है मैं आम तौर पर एक डमी टेम्पलेट पैरामीटर, जैसे (कफ बंद, संकलक के गंदे हाथों से अछूता)

template< class UniqueId > 
struct Blah {}; 

typedef Blah< struct AlphaId > Alpha; 
typedef Blah< struct BetaId > Beta; 

का उपयोग किया है यह या नहीं हो सकता जिसकी आपको जरूरत है।

चीयर्स & hth,

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