दिलचस्प पोस्ट
क्यों अप्रयुक्त रिटर्न वैल्यू को शून्य में डालें? एंटरप्राइज़ एप तैनाती आईओएस 7.1 पर काम नहीं करता है Raycast NullReferenceException त्रुटि का कारण बनता है जावा का उपयोग कर एक निर्देशिका में फाइल की संख्या की गिनती RE: ggplot2 के साथ व्यक्तिगत सलाखों पर संख्याओं की संरेखण अपरिभाषित विधि 'कार्य' रेक 0.9.0 का उपयोग कर WPF में "माउस कैप्चर" का क्या अर्थ है? कंसोल से पासवर्ड इनपुट मास्किंग: जावा हैश टेबल वास्तव में हे हो (1) हो सकता है? \ == / 2 या dif / 2 का उपयोग करना अफीम स्विफ्ट सपोर्ट / स्विफ्ट का अमान्य कार्यान्वयन एक मैक पर x86 विधानसभा WinAPI के साथ फ़ोल्डर के चयनित आइटम प्राप्त करें सी ++ 11 समान प्रारंभिक सिंटैक्स का उपयोग कैसे करें? जीमेलसेन्डर के माध्यम से ईमेल संलग्नक भेज रहा है?

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

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

// 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 ) को संभालने वाली समस्याओं के साथ कंपाइलर अपेक्षाकृत पुराना है और मैं इसे करने की कोशिश कर रहा हूं अन्य सभी कंपलर इस पर पूरी तरह खुश हैं, लेकिन स्पष्ट रूप से कुछ भी साबित नहीं होता है।

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

Solutions Collecting From Web of "मिश्रण वर्ग और संरचना"

ऐसा लगता है कि यह परिभाषित व्यवहार है विशेष रूप से, § 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