2011-03-26 15 views
16

मेरे पास एक कक्षा और एक कॉन्स वैरिएबल है।सी ++ पीओडी प्रकार में कोई कन्स्ट्रक्टर नहीं हो सकता है?

struct A 
{ 
    int b; 
}; 

A const a; 

कक्षा A पीओडी है और इसे इस तरह शुरू किया जा सकता है।

A const a = { 3 }; 

आईएमएचओ, ऐसा लगता है कि ऐसा कोई कन्स्ट्रक्टर है।

struct A 
{ 
    int b; 

    A(int newB) : b(newB) 
    { 
    } 
}; 

लेकिन क्लैंग A गैर-कुल प्रकार के रूप में मानता है। मेरे पास ऐसा कन्स्ट्रक्टर क्यों नहीं हो सकता है? या मुझे कुछ और करना चाहिए?


मैंने अपना मूल अर्थ प्रस्तुत करने के लिए प्रश्न संशोधित किया। मैंने गलती से class रूप struct लिखा था, और के बारे में भ्रामक :) @Johannes के लिए खेद है

+0

Eonil : मेरा मानना ​​है, मेरा जवाब आपके सभी संदेहों को स्पष्ट करता है, खासकर मानक से उद्धरण। – Nawaz

+0

आपको यह तय करने की आवश्यकता है कि आप किस प्रश्न के बारे में हैं: 1) पीओडी-प्रकार या 2) बस '{}' प्रारंभकर्ता (यानी समेकित) का उपयोग करने की क्षमता। इस समय यह स्पष्ट नहीं है कि विशेष रूप से समस्या क्या है। – AnT

+0

@ नवाज देखभाल के लिए धन्यवाद। आपका जवाब वह है जो मैं चाहता हूं! – Eonil

उत्तर

17

POD का मतलब सादा पुराना डेटा प्रकार जो परिभाषा के द्वारा उपयोगकर्ता परिभाषित निर्माता नहीं हो सकता।

पीओडी वास्तव में एक समग्र प्रकार है (अगला उद्धरण देखें)। तो कुल क्या है? सी ++ स्टैंडर्ड अनुभाग §8.5.1/1 में कहते हैं,

एक कुल साथ एक सरणी या एक वर्ग (खंड 9) कोई उपयोगकर्ता के घोषित कंस्ट्रक्टर्स (12.1), कोई निजी या सुरक्षित है गैरस्टिक डेटा सदस्य (खंड 11), कोई आधार वर्ग (खंड 10), और कोई वर्चुअल फ़ंक्शन (10.3) नहीं है।

और अनुभाग §9/4 सी ++ स्टैंडर्ड से कहते हैं,

[....] एक पॉड-struct एक समग्र वर्ग है कोई गैर स्थिर डेटा की सदस्य हैं गैर पॉड-struct, गैर पॉड संघ (या ऐसे प्रकार की सरणी) या संदर्भ टाइप करें, और कोई उपयोगकर्ता परिभाषित प्रति असाइनमेंट ऑपरेटर और कोई उपयोगकर्ता परिभाषित नाशक है। इसी तरह, एक पॉड संघ एक समग्र संघ कि प्रकार गैर पॉड-struct, गैर पॉड संघ (या ऐसे प्रकार के सरणी) या संदर्भ का कोई गैर स्थैतिक डेटा सदस्य हैं, और है कोई उपयोगकर्ता द्वारा परिभाषित प्रति असाइनमेंट ऑपरेटर और कोई उपयोगकर्ता परिभाषित विनाशक। एक पीओडी कक्षा एक वर्ग है जो या तो पीओडी-स्ट्रक्चर या पीओडी-यूनियन है।

इस से

, इसकी भी स्पष्ट है कि पॉड वर्ग/struct/संघ हालांकि उपयोगकर्ता परिभाषित असाइनमेंट ऑपरेटर नहीं हो सकता और उपयोगकर्ता परिभाषित नाशक भी।


हालांकि अन्य प्रकार के पीओडी हैं। खंड §3।9/10 कहते हैं,

अंकगणित प्रकार (3.9.1), गणन प्रकार, सूचक प्रकार, और सदस्य प्रकार (3.9.2) के लिए सूचक है, और इन प्रकार की सीवी योग्य संस्करण (3.9 .3) सामूहिक रूप से स्केलर प्रकार कहा जाता है। अदिश प्रकार, पॉड-struct प्रकार, पॉड संघ प्रकार (खंड 9), इस तरह के प्रकार के सरणियों और सीवी योग्य संस्करण इन प्रकार के (3.9.3) सामूहिक रूप से कहा जाता है पॉड प्रकार हैं।

इस FAQ पढ़ें: What is a "POD type"?

+0

मुझे मिल गया! धन्यवाद। – Eonil

5

वर्ग एक पॉड है और इस

क्षमा की तरह प्रारंभ किया जा सकता है, जो गलत है। क्योंकि b निजी है, कक्षा एक पीओडी नहीं है।

लेकिन क्लैंग ए को गैर-कुल प्रकार के रूप में मानता है। मेरे पास ऐसा कन्स्ट्रक्टर क्यों नहीं हो सकता है? या मुझे कुछ और करना चाहिए?

यह सी ++ की सीमा है क्योंकि यह वर्तमान में मौजूद है। सी ++ 0x में अब यह सीमा नहीं होगी। जबकि सी ++ 0x में आपका प्रकार पीओडी नहीं है, तो आपका प्रारंभिक कार्य करेगा (यह मानते हुए कि आप उस निर्माता को public बनाते हैं)।

(साथ ही, मुझे लगता है कि आपके लिए यहां उपयोग करने के लिए एक बेहतर शब्द "कुल" है। { ... } का उपयोग करने की आवश्यकता यह है कि आपकी कक्षा एक कुल है। इसे पीओडी नहीं होना चाहिए)।

+1

ओह धन्यवाद। 'संरचना' के बजाय 'कक्षा' का उपयोग करके मेरी गलती थी। मुझे माफ कर दो। मैं डिफ़ॉल्ट पहुंच के बारे में परवाह नहीं कर सका। मैंने अपना प्रश्न अपडेट किया। और कुल लेकिन गैर-पीओडी प्रकारों के लिए टिप्पणी स्वयं सहायक है :) – Eonil

2

अन्य उत्तरों पीओडी नियमों का वर्णन बहुत अच्छी तरह से करते हैं। यदि आप एक पॉड के लिए एक निर्माता के लिए एक ऐसी ही प्रारंभ शैली प्राप्त करना चाहते हैं तो आप उदाहरण के लिए, एक make_ शैली समारोह का उपयोग कर सकते हैं:

struct A 
{ 
    int i_; 
}; 

A make_A(int i = 0) 
{ 
    A a = { i }; 
    return a; 
} 

अब आप प्रारंभ कर सकते हैं पॉड उदाहरणों की तरह:

A a = make_A(); 
संबंधित मुद्दे