2012-04-09 14 views
14

सी ++ में अज्ञात वर्ग नामक एक सुविधा है। यह सी में अज्ञात संरचना के समान है। मुझे लगता है कि इस सुविधा का आविष्कार कुछ जरूरतों के कारण किया गया है, लेकिन मैं यह नहीं समझ सकता कि यह क्या है।मुझे सी ++ में अनाम कक्षा की आवश्यकता कब होगी?

क्या मेरे पास कुछ उदाहरण हो सकता है जिसे वास्तव में अज्ञात वर्ग की आवश्यकता है?

+1

आप गुमनाम struct क्यों हैं गुमनाम (vs2015) में ऑटो के साथ काम कर सकते हैं? – Nawaz

+0

@ नवाज आह हाँ, आप सही हैं। मैं इसी कारण से हो सकता हूं कि यह सी पर क्यों मौजूद है। वैसे भी मैं विशेष रूप से सी ++ के मामलों के बारे में उत्सुक हूं। चूंकि सी ++ सी – Eonil

उत्तर

19

सुविधा इसलिए है क्योंकि struct और class वही बात है - आप एक के साथ कुछ भी कर सकते हैं, आप दूसरे के साथ कर सकते हैं। यह सी में अज्ञात struct के समान उद्देश्य के समान कार्य करता है; जब आप एक साथ कुछ सामान समूह करना चाहते हैं और इसके एक या अधिक उदाहरण घोषित करना चाहते हैं, लेकिन उस प्रकार को नाम से संदर्भित करने की आवश्यकता नहीं है।

यह सी ++ में आमतौर पर उपयोग किया जाता है, आंशिक रूप से क्योंकि सी ++ डिज़ाइन अधिक प्रकार-उन्मुख होते हैं, और आंशिक रूप से क्योंकि आप अज्ञात वर्गों के लिए रचनाकार या विनाशक घोषित नहीं कर सकते हैं।

2

शायद यह कभी कभी की तरह नीडिंत कार्यों बनाने के लिए मददगार था:

void foo() { 
    class { 
    void operator()(){ 
    } 
    } bar; 
    bar(); 
} 

लेकिन अब हम lambdas और अनाम कक्षाओं संगतता कारणों के लिए केवल छोड़ दिया जाता है की है।

4

यह सख्त अर्थ में वास्तव में आवश्यक नहीं है और कभी नहीं था। अर्थात। आप हमेशा एक नाम असाइन कर सकते हैं, उदाहरण के लिए anonymous1, anonymous2 इत्यादि। लेकिन आवश्यकतानुसार अधिक नामों का ट्रैक रखना हमेशा परेशानी होती है।

जहां यह सहायक है, वह किसी भी स्थान पर है जहां कोई उस समूह को नाम दिए बिना डेटा समूह करना चाहता है।

class foo { 
    class { 
    public: 
    void validate(int x) { m_x = x; } 
    bool valid() { return m_exists; } 
    private: 
    int m_x; 
    bool m_exists; 
    } maybe_x; 
}; 

इस मामले int में और bool तार्किक साथ रहती हैं, तो यह उन्हें समूह में समझ में आता है: मैं एक कई उदाहरण के साथ आ सकता है। हालांकि इस ठोस उदाहरण के लिए यह संभवतः एक वास्तविक वैकल्पिक प्रकार बनाने या उपलब्ध लोगों में से एक का उपयोग करने के लिए समझ में आता है, क्योंकि यह पैटर्न अन्य स्थानों पर भी अधिकतर उपयोग किया जाता है। अन्य मामलों में समूहीकरण का यह पैटर्न इतना खास हो सकता है कि यह केवल उस वर्ग में रहने के योग्य है।

मैं वास्तव में हालांकि मानता हूं कि अज्ञात वर्गों का शायद ही कभी उपयोग किया जाता है (मैंने केवल उन्हें अपने जीवन में कुछ बार उपयोग किया है)। अक्सर जब कोई डेटा समूह करना चाहता है, तो यह कक्षा या दायरा विशिष्ट नहीं है बल्कि एक समूह भी है जो अन्य स्थानों पर भी समझ में आता है।

+1

के साथ बहुत अलग भाषा है क्योंकि आपके उदाहरण को क्लास इनवेरिएंट सुनिश्चित करने के लिए एक कन्स्ट्रक्टर की आवश्यकता होगी (या तो मान मान्य है, या ध्वज झूठा है); लेकिन आप एक अज्ञात वर्ग के लिए एक कन्स्ट्रक्टर घोषित नहीं कर सकते हैं। –

+0

@ माइकसेमोर: अच्छा बिंदु। मुझे लगता है कि किसी को इस तरह का ख्याल रखना होगा। शायद कक्षा प्रारंभकर्ता में सी ++ 11 के साथ यह होगा। जैसा कि मैंने कहा था कि यह शायद ही कभी बहुत ही कम इस्तेमाल की जाने वाली सुविधा है। – LiKao

1

अज्ञात वर्गों का उपयोग मौजूदा सी कोड के साथ संगतता को संरक्षित करने के लिए है। उदाहरण:

कुछ सी कोड में, अज्ञात संरचनाओं के संयोजन के साथ टाइपपीफ का उपयोग प्रचलित है।

1

कि किसी भी वर्ग के साथ और QObject व्युत्पन्न आवश्यकता के बिना क्यूटी 5 के सिग्नल/स्लॉट प्रणाली के साथ इस्तेमाल किया जा सकता गुमनाम structs का एक उदाहरण है:

void WorkspaceWidget::wwShowEvent() 
{ 
    //Show event: query a reload of the saved state and geometry 
    gcmessage("wwShowEvent "+ this->title()); 
    struct{void* t; void operator()(){ static_cast<WorkspaceWidget*>(t)->wwReloadWindowState(); }}f; 
    f.t=this; 
    QObject::connect(&reloadStateTimer, &QTimer::timeout, f); 
    reloadStateTimer.start(); 
} 

void WorkspaceWidget::wwReloadWindowState() 
{ 
    gcmessage(dynamic_cast<QObject*>(this)->metaObject()->className()); 
} 

मूल रूप से, मैं एक के लिए एक टाइमर संकेत कनेक्ट करने की आवश्यकता गैर-QObject व्युत्पन्न कक्षा, लेकिन माउंट "यह" सही ढंग से पास करना चाहते हैं।

QObject :: कनेक्ट Qt 5 में सामान्य फ़ंक्शन से कनेक्ट किया जा सकता है, इसलिए यह अज्ञात वर्ग वास्तव में एक मजेदार है जो इस पॉइंटर को अपने आप में रखता है, फिर भी स्लॉट कनेक्शन को पास करता है।

+0

लेकिन सी ++ 11 – paulm

+0

में लैम्ब्डा के साथ प्रतिस्थापित करना बेहतर है, लेखन के समय, QObject समझने में असफल रहा कि "लैम्ब्डा" क्या है, लेकिन उन्होंने बाद में इसे ठीक किया। –

0

इसके अलावा, आप

struct { 

    auto* operator->() {return this;} 
    //do other functions 

} mystruct; 
संबंधित मुद्दे