2011-07-07 11 views
5

मैं एक ध्वनि पुस्तकालय (ओपनएएल के साथ) पर काम कर रहा हूं, और एफएमओडी द्वारा प्रदान किए गए इंटरफ़ेस से प्रेरणा ले रहा हूं, आप इंटरफ़ेस at this link देख सकते हैं।यह कोड एक वर्ग का उदाहरण कैसे बनाता है जिसमें केवल एक निजी निर्माता है?

मैंने कुछ अवधारणाएं प्रदान की हैं जैसे: ध्वनि, चैनल और चैनल समूह, जैसा कि आप एफएमओडी इंटरफ़ेस के माध्यम से देख सकते हैं, उन सभी वर्गों में एक निजी कन्स्ट्रक्टर है और, उदाहरण के लिए, यदि आप ध्वनि बनाते हैं तो आप फ़ंक्शन का उपयोग करते हैं createSound() सिस्टम क्लास द्वारा प्रदान किया गया (वही यदि आप कोई चैनल या चैनल समूह बनाते हैं)।

मैं एक समान तंत्र प्रदान करना चाहता हूं, लेकिन मुझे समझ में नहीं आता कि यह कैसे काम करता है। उदाहरण के लिए, फ़ंक्शन createSound() ध्वनि की एक नई आबादी कैसे बना सकता है? कन्स्ट्रक्टर निजी है और साउंड इंटरफ़ेस से कोई स्थिर विधि या दोस्ती नहीं है। कुछ पैटर्न का उपयोग किया जाता है?

संपादित करें: ओपी के प्रश्न को स्पष्ट करने के लिए, वह निजी कन्स्ट्रक्टर के साथ कक्षा का उदाहरण बनाने के लिए नहीं कह रहा है, सवाल यह है कि पोस्ट किए गए लिंक में, क्लास के निर्माण का उदाहरण कैसा है जिसमें निजी कन्स्ट्रक्टर है और कोई स्थैतिक विधियां या मित्र कार्य नहीं।

धन्यवाद।

+0

मित्रों के सदस्यों का उपयोग करने का प्रयास किया गया है – zabulus

+0

यह इंटरफ़ेस खराब दिखता है। आम तौर पर, "सिस्टम" या "ईश्वर" वर्गों को विरोधी पैटर्न के रूप में जाना जाता है। – MSalters

+0

क्या यह उप-वर्ग का उदाहरण बना रहा है जिसमें कोई सार्वजनिक या मित्र कन्स्ट्रक्टर है और उसे वापस कर रहा है? – jcoder

उत्तर

0
struct Foo { 
    enum Type { 
     ALPHA, 
     BETA_X, 
     BETA_Y 
    }; 
    Type type() const; 
    static Foo alpha (int i) {return Foo (ALPHA, i);} 
    static Foo beta (int i) {return Foo (i<0 ? BETA_X : BETA_Y, i);} 
private: 
    Foo (Type, int); 
}; 

create_alpha एक नि: शुल्क समारोह friend घोषित हो सकता था, लेकिन वह सिर्फ नेमस्पेस को दूषित कर रहा है।

मुझे डर है कि मैं उस लिंक तक नहीं पहुंच सकता लेकिन एक और तरीका कारखाना पैटर्न हो सकता है। मैं थोड़ा सा अनुमान लगा रहा हूं।

+4

ओपी पोस्ट किए गए उन इंटरफेस में कोई 'स्थैतिक विधियां' नहीं हैं। –

0

यह कारखाना पैटर्न है - जैसा कि उनकी टिप्पणी कहती है।

/* 
    FMOD System factory functions. 
*/ 
inline FMOD_RESULT System_Create(System **system) { return FMOD_System_Create((FMOD_SYSTEM **)system); } 

यह कहना के रूप में वे FMOD_System_Create विधि लिए स्रोत को प्रकाशित नहीं है कि वास्तव में क्या हो रहा है मुश्किल है।

कारखाना पैटर्न एक वस्तु बनाने के लिए एक तंत्र है लेकिन उत्पादित (उप) वर्ग फैक्ट्री कॉल के मानकों पर निर्भर करता है। http://en.wikipedia.org/wiki/Factory_method_pattern

+1

कारखाने को अभी भी सीटीओआर तक पहुंचने में सक्षम होना चाहिए ... – Dennis

7

स्रोत कोड को देखे बिना कहना मुश्किल है। ऐसा लगता है कि एफएमओडी वैश्विक चर के साथ 100% सी है और इसके आसपास एक खराब "ओओपी" सी ++ रैपर है।

स्रोत कोड की अनुपस्थिति को देखते हुए और .h फ़ाइलों में खेले गए कुछ बुरे चालों को कोड को एक अलग शीर्षलेख फ़ाइल का उपयोग करके संकलित किया जा सकता है और फिर काम पर होता है (भले ही यह स्पष्ट रूप से गैर-मानक है) वे कंपाइलर्स के साथ उपयोग कर रहे हैं।

मेरा अनुमान है कि सी ++ रैपर के लिए वास्तविक (अप्रकाशित) स्रोत कोड एक स्थैतिक विधि को परिभाषित कर रहा है या वैकल्पिक रूप से यदि सबकुछ वास्तव में वैश्विक है तो वस्तु वास्तव में भी बनाई गई नहीं है और सी ++ ऑब्जेक्ट सिस्टम को मूर्ख बनाने के लिए चाल चल रही हैं यह सोचने के लिए कि वास्तव में एक वस्तु है। स्पष्ट रूप से सभी प्रेषण स्थैतिक है इसलिए यह (औपचारिक रूप से कानूनी नहीं होने पर) सी ++ कार्यान्वयन के साथ वैसे भी काम करने के लिए हो सकता है।

जो भी उन्होंने किया वह सी ++ बिंदु दृश्य से काफी बदसूरत और गैर-अनुरूप है।

+1

+1 प्रश्न पढ़ने वाले एकमात्र उत्तरदाता होने के लिए। और सही होने के लिए - ऐसा करने के लिए कोई मानक-अनुकूल तरीका नहीं है। – interjay

+0

यह स्पष्ट है, मुझे लगता है कि बेहतर काम मेरे इंटरफेस पर पुनर्विचार है। – enigma

1

वे कभी भी कोई उदाहरण नहीं बनाते!कारखाने समारोह हैडर

/* 
    FMOD System factory functions. 
*/ 
inline FMOD_RESULT System_Create(System **system) 
{ return FMOD_System_Create((FMOD_SYSTEM **)system); } 

सूचक आप में पारित एक प्रणाली वस्तु पाने के लिए तुरंत एक सी struct fmod.h शीर्षक में घोषित करने के लिए एक सूचक को डाला जाता है में सही नहीं है।

चूंकि यह किसी भी डेटा सदस्य के बिना कक्षा है जो अंतर बता सकता है?

+0

आपका मतलब है कि वे पॉइंटर को स्टोर करने के लिए पते को पास करते हुए एक सी फ़ंक्शन को कॉल करते हैं (लेकिन यह फ़ंक्शन वास्तव में क्या नहीं दिखाया जाता है)। मुझे यकीन नहीं है कि वास्तविक सी ऑब्जेक्ट में वास्तव में कोई डेटा सदस्य नहीं है क्योंकि यहां उपयोग किए जाने वाले अयोग्य गैर मानक ट्रिकरी के स्तर को देखते हुए मुझे आश्चर्य नहीं होगा कि पुस्तकालय वास्तव में विभिन्न शीर्षकों का उपयोग करके संकलित किया गया है और दृश्यमान शीर्षलेख वास्तव में हैं लाइब्रेरी उपयोगकर्ताओं के लिए। – 6502

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