2010-10-17 13 views
5

डेमो एक पीओडी प्रकार सी ++ 03 में है?निजी सदस्यों के साथ सादा पुराने डेटा प्रकार?

struct Demo 
{ 
    private: 
     int x; 
     int y; 
}; 

सी ++ 03, §9p4:

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

Steve Jessop's post पढ़ने के बाद, मेरा मानना ​​है कि डेमो एक गैर-पीओडी है क्योंकि सदस्य निजी हैं। हालांकि मानक पीओडी प्रकारों और एक्सेस संशोधक के बीच संबंध के बारे में कुछ भी नहीं कहता है।

C++ 0x डेमो में पॉड है, क्योंकि §9p9 (n3126) का कहना है:

एक पॉड struct एक वर्ग है कि दोनों एक छोटी सी वर्ग और एक मानक लेआउट वर्ग है है, और कोई नहीं है गैर-स्थैतिक डेटा सदस्यों के प्रकार गैर-पीओडी संरचना, गैर-पीओडी संघ (या इस तरह के सरणी)। इसलिए यह एक पॉड है

डेमो तुच्छ के साथ-साथ एक मानक लेआउट वर्ग है। क्या मेरी व्याख्या सही है?

एक छोटी कक्षा एक कक्षा है जिसमें एक छोटा डिफ़ॉल्ट कन्स्ट्रक्टर (12.1) होता है और यह तुलनीय रूप से कॉपी करने योग्य होता है। [9 पी 5, एन 3126]

+0

मैं मानता हूँ चाहते हैं कि यह पॉड है। ऐसा लगता है कि परिभाषा के कुछ हिस्सों एक दूसरे के विरोधाभास कर रहे हैं कि कुल मिलाकर निजी सदस्यों के पास नहीं हो सकता है, लेकिन फिर निजी सदस्यों को कहीं और नहीं नोट किया जाता है। चाहे सदस्य सार्वजनिक या निजी हों, डिफ़ॉल्ट रूप से तुलना नहीं करेंगे और निर्माण की प्रतिलिपि नहीं करेंगे, इसलिए मैं सहमत हूं कि यह मामूली है और इसलिए पीओडी है। – JoshD

उत्तर

13

सी ++ 03 में, यह निश्चित रूप से एक पीओडी नहीं है। §9/4 के अनुसार, "एक पॉड-struct एक समग्र वर्ग है ...", और §8.5.1/1 के अनुसार:

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

सी ++ 0x के तहत, कम से कम N3090/3092 के रूप में, मुझे विश्वास है कि यह एक पीओडी है। इन्हें केवल इतना आवश्यक है कि सभी गैर स्थैतिक सदस्यों के पास समान पहुंच हो, न कि पहुंच एनईसी है मूल रूप से सार्वजनिक।

struct x { 
    int a; 
public: 
    int b; 
public: 
    int c; 
}; 

यह एक पॉड struct की आवश्यकताओं को फिट बैठता है: - यह एक समस्या मुझे विश्वास है कि मैं पहली बार बाहर बात करने के लिए था ठीक करने के लिए है सी ++ 98/03 में, एक हलका पहुँच विनिर्देशक एक समस्या की ओर जाता है - लेकिन मानक अभी भी हस्तक्षेप पहुंच विनिर्देशक के कारण b और c की सापेक्ष स्थिति के लिए अनुमति देता है। नतीजतन, एक पीओडी संरचना होने से लेआउट गारंटी प्रदान नहीं होती है जिसका उद्देश्य सी structs (स्पष्ट उदाहरण के लिए) के साथ संगतता सुनिश्चित करने के लिए किया गया था।

+0

लॉल, मैंने अभी आपके जैसा ही सटीक उदाहरण लिखा है। – Potatoswatter

+0

... और मुझे RTFM'd होना चाहिए, सी ++ 0x ने पहले से ही मेरे सिर से सी ++ 03 को धक्का दिया है: vP। +1 – Potatoswatter

+0

धन्यवाद !! मैं '§8.5.1/1: 'कैसे याद कर सकता हूं? वैसे भी मेरी व्याख्या सही थी। ';-)' –

3

से सबसे आसान पर सी ++ 11 अब तक std::is_pod साथ संकलक पूछना है:

#include <iostream> 
#include <type_traits> 

struct Demo 
{ 
    private: 
     int x; 
     int y; 
}; 

int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << std::is_pod<Demo>::value << std::endl; 
} 

सच

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