दिलचस्प पोस्ट
क्या वैश्विक स्मृति को सी ++ में आरम्भ किया जाता है? दृश्य स्टूडियो डीबगर में एक गतिशील आवंटित सरणी कैसे प्रदर्शित करें? इनो सेटअप घटकों पर लंबे विवरण कैसे jqGrid संदर्भ मेनू बनाने के लिए? ओएस एक्स संकुल अधिष्ठापन gfortran-4.8 पर निर्भर करता है मैं PHP या HTML के माध्यम से अपने ब्राउजर में एक शब्द दस्तावेज़ कैसे देख सकता / खोल सकता / खोल सकता हूं JQuery के साथ एक div की दृश्यमान ऊंचाई प्राप्त करें Log4j2 में एक कस्टम एपेन्डर कैसे बनाएं? रेट्रोफिट 2 के साथ लॉगिंग क्या पायथन का आदेश दिया गया सेट है? चेनिंग .bind () जावास्क्रिप्ट में कॉल अप्रत्याशित परिणाम? क्या यह कोड SQL इंजेक्शन को रोकता है? जावास्क्रिप्ट माइम प्रकार मैं एक Git रिपॉजिटरी से .DS_Store फ़ाइलों को कैसे निकाल सकता हूं? अजगर का उपयोग करना, मैं विंडोज़ नेटवर्क पर एक साझा फ़ोल्डर का उपयोग कैसे कर सकता हूं?

मिश्रण वर्ग और संरचना

मैं वर्ग और संरचना के बीच अंतर के बारे में अच्छी तरह जानता हूं, हालांकि मैं आधिकारिक तौर पर यह कह रहा हूं कि यह अच्छी तरह से परिभाषित है:

// declare foo (struct) struct foo; // define foo (class) class foo { }; // instance of foo, claiming to be a struct again! Well defined? struct foo bar; // mixing class and struct like this upsets at least one compiler (names are mangled differently) const foo& test() { return bar; } int main() { test(); return 0; } 

यदि यह अपरिभाषित व्यवहार होता है तो कोई मुझे एक आधिकारिक (आईएसओ से अध्याय और कविता) संदर्भ की दिशा में बता सकता है?

इस ( कार्बाइड 2.7 ) को संभालने वाली समस्याओं के साथ कंपाइलर अपेक्षाकृत पुराना है और मैं इसे करने की कोशिश कर रहा हूं अन्य सभी कंपलर इस पर पूरी तरह खुश हैं, लेकिन स्पष्ट रूप से कुछ भी साबित नहीं होता है।

मेरा अंतर्ज्ञान यह अनिर्धारित व्यवहार होना चाहिए था लेकिन मुझे इसकी पुष्टि करने के लिए कुछ भी नहीं मिल पाया और मुझे आश्चर्य है कि जीसीसी के संस्करण या कमो से कोई भी इसके बारे में चेतावनी नहीं देता।

वेब के समाधान से एकत्रित समाधान "मिश्रण वर्ग और संरचना"

ऐसा लगता है कि यह परिभाषित व्यवहार है विशेष रूप से, § 9.1 / 2 कहते हैं:

एक घोषणा जिसमें पूरी तरह से class-key identifier ; या तो वर्तमान गुंजाइश में नाम का एक पुनर्वितरण या एक वर्ग के नाम के रूप में पहचानकर्ता के आगे घोषणा। यह वर्तमान क्षेत्र में कक्षा का नाम प्रस्तुत करता है

एक वर्ग को परिभाषित करते समय मानक, struct या union का उपयोग करते हुए मानक, लेकिन यहां, एक घोषणा के बारे में बात करते हुए, ऐसा कोई भेद नहीं दिया जाता है – एक class-key का उपयोग किसी अन्य के समान है

चेतावनी C4099 से: टाइप नाम पहले 'स्ट्रेट' (एमएस वीएस 2 के 8) का इस्तेमाल करते हुए अब देखा गया 'क्लास' का उपयोग करते हुए देखा गया है कि कम से कम कुछ कंपाइलर उपयोग किए गए कीवर्ड के आधार पर अलग-अलग तरीके से उलझाव करते हैं, इसलिए इसे तकनीकी रूप से अनुमति देने पर भी भरोसा नहीं करना चाहिए ( जिनमें से मैं एक पुष्टि संदर्भ नहीं मिल सकता है)।

तकनीकी रूप से भाषा मानक के अनुसार कोड ठीक है। हालांकि, सबसे कम-से-कम एक लोकप्रिय कम्पाइलर इस के लिए एक चेतावनी का कारण बनता है, यह व्यवहार में काम नहीं करता है।

"सिद्धांत रूप में, सिद्धांत और व्यवहार के बीच कोई अंतर नहीं है।"

सी ++ में, एक स्ट्रैट एक क्लास है। विशेष रूप से:

एक संरचना एक क्लास-कुंजी struct साथ परिभाषित कक्षा है (आईएसओ / आईईसी एफडीआईएस 14882: 1998 (ई) 9-4)

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

मुझे नहीं पता है कि यह सी मानक के अनुसार अपरिभाषित है (या अन्य श्रेणियों में से कोई भी नहीं- सख्ती-अनुरूप), लेकिन मुझे पता है कि अगर आपके पास दो अनुवाद इकाइयां हैं, जो कि एक प्रकार की ' फू 'को एक' वर्ग 'या' संरचना 'के रूप में घोषित किया गया है, जैसे:

टीयू 1

 struct foo; void f(foo&) { ... } 

टीयू 2

 class foo { ... }; void f(foo&); void g() { foo x; f(x); } 

तो, कम से कम कुछ कंपाइलर (विशेषकर एमएसवीसी ++) प्रत्येक अनुवाद इकाई में अलग-अलग f नाम का मिश्रण करेंगे, इसलिए टीयू 1 में f की परिभाषा टीयू -2 में f के संदर्भ को संतुष्ट नहीं करती है और आपको एक लिंक त्रुटि मिलती है। यह वास्तविक जीवन में आता है जब आपके पास एक शीर्षक है जो कक्षा A को परिभाषित करता है और कक्षाएं B , C , और D को संदर्भित करने की आवश्यकता होती C , लेकिन उनमें से एक आगे की घोषणा पर्याप्त होती है (इसलिए यह काफी संवेदनात्मक रूप से Bh आदि शामिल नहीं है ) – आप उन अग्रेषण घोषणाओं के लिए उसी कीवर्ड का बेहतर उपयोग करते हैं जो वास्तविक परिभाषाएं करते हैं!

MSVC10 एक चेतावनी फेंकता है, और चेतावनी पृष्ठ बताता है कि परिभाषा में दिए गए प्रकार का उपयोग किया जाएगा।

http://msdn.microsoft.com/en-us/library/695x5bes.aspx