2010-01-20 12 views
6

यह देखते हुए:वस्तुओं के बारे में इनमें से कौन सा कथन सत्य है?

struct { int x; } ix; 

struct A { A() {}; int x; }; 
A ia; 

इनमें से कौन सही है?

a. ix is an object 
b. ia is an object 
c. both are objects 
d. both are not objects. 
+1

फेह। नीचे बहुत बहस। जो कोई भी वास्तव में कंप्यूटर विज्ञान में अपनी डिग्री प्राप्त करता है और कक्षाओं में भाग लेता है, वह इस बात को पढ़ सकता है कि वह क्या है और न ही उनके बारे में बहस करना चाहते हैं। प्रश्न में "ऑब्जेक्ट" स्पष्ट रूप से एक वर्ग के उदाहरण को संदर्भित करने के लिए है, यानी एक संदर्भ चर जो ढेर पर संग्रहीत है। कौन सा संरचना नहीं है। सींगनेट घोंसला को हल करने के लिए बस +1। –

+5

@ जोएल: ढेर पर न तो ix not ia संग्रहित नहीं है। वे या तो ग्लोबल्स या ऑटोमैटिक हैं, जहां परिभाषाएं होती हैं, लेकिन मुझे 'नया' या 'मॉलोक'/'कॉलोक' का कोई उपयोग नहीं दिखता है। दोनों कक्षाएं सी ++ कॉल करती हैं, इस तथ्य के बावजूद कि उनकी कक्षाओं को 'संरचना' के साथ परिभाषित किया गया है, और तथ्य यह है कि ix के प्रकार का कोई नाम नहीं है। –

+2

@ जोएल: जब से "एक ढेर पर संग्रहीत किया जाना चाहिए" कक्षा के लिए एक आवश्यकता? मुझे नहीं पता कि आपने देखा है, लेकिन यह प्रश्न सी ++ टैग किया गया है, और सी ++ में, क्लास ऑब्जेक्ट्स को स्टैक पर बस ठीक से संग्रहीत किया जा सकता है। – jalf

उत्तर

10

इनमें से कई उत्तरों ने सी ++ टैग को अनदेखा कर दिया है। सी ++ में, "ऑब्जेक्ट स्टोरेज का एक क्षेत्र है। [नोट: फ़ंक्शन एक ऑब्जेक्ट नहीं है, चाहे वह ऑब्जेक्ट्स के समान तरीके से स्टोरेज पर कब्जा कर लेता है या नहीं।]" (सी ++ मानक, 1.8/1)।

यदि गृहकार्य प्रश्न सी ++ के बारे में है, तो ऑब्जेक्ट की कोई अन्य परिभाषा लागू नहीं होती है, यहां तक ​​कि "कुछ भी दिखाई नहीं दे रहा है या मूर्त है और अपेक्षाकृत स्थिर है" (dictionary.reference.com)। यह ओओपी सिद्धांतों के बारे में आपकी राय नहीं मांग रहा है, यह प्रभावी रूप से पूछ रहा है कि क्या ix और ia चर हैं।

चूंकि यह होमवर्क मैं तुम्हें इस सवाल का जवाब नहीं बता देंगे, लेकिन ध्यान दें है कि struct { int x; } ix;struct ix { int x; }; के रूप में एक ही बात है नहीं है।

दूसरी तरफ, यदि होमवर्क असाइनमेंट ओओपी सिद्धांतों के बारे में है, तो अपने व्याख्याता ने आपको "ऑब्जेक्ट" की परिभाषा के साथ स्वयं को खारिज कर दिया है। चूंकि मुझे नहीं पता कि वह क्या है, मैं आपको यह नहीं बता सकता कि वह किस जवाब पर सही विचार करेगा ...

+0

यह एक सी ++ परिचय वर्ग है। मेरा जवाब होगा कि वे दोनों C++ – Murali

+0

+1 में ऑब्जेक्ट्स हैं: मानक लुकअप –

+0

हाँ, यह मेरा जवाब भी होगा। वास्तव में, (ए), (बी) और (सी) सभी सच हैं, इसलिए गलत जवाब देने में बहुत मुश्किल है ;-)। अगर प्रशिक्षक (सी) से असहमत है, तो मैं भविष्य में बेहतर प्रश्न पूछूंगा ... –

1

शब्द "वस्तु" कुछ और संदर्भ के बिना एक नहीं बल्कि अस्पष्ट विनिर्देश है, लेकिन सामान्य रूप में वस्तुओं पहचान, व्यवहार, और राज्य है।

न तो ix और न ही ia में तीनों हैं; ix विफल रहता है क्योंकि इसमें पहचान या व्यवहार की कमी है, और ia विफल रहता है क्योंकि इसका कोई व्यवहार नहीं है। दोनों अनिवार्य रूप से डेटा के blobs हैं।

+3

किसी वस्तु को व्यवहार की आवश्यकता क्यों होती है। मुझे लगता है कि राज्य आपको एक वस्तु के रूप में वर्गीकृत करने के लिए पर्याप्त है। –

+0

जो मैंने सोचा था, लेकिन मेरे प्रशिक्षक जोर देते हैं कि ए में एक कन्स्ट्रक्टर है और यह कि एक वर्ग/संरचना का एक उदाहरण इसे एक वस्तु बनाता है। – Murali

+0

@ मार्टिन: मैं सहमत नहीं हूं। 'int x = 5;' 'x' को राज्य को पकड़ने की अनुमति देता है, लेकिन एक वस्तु 'int' (आदिम) है? –

0

मेरी परिभाषा के अनुसार, मैं कहूंगा कि किसी ऑब्जेक्ट में गुण और विधियां हैं। संज्ञा और क्रिया दोनों।

आप एक गेंद लात मार सकते हैं, आप एक देश पर आक्रमण कर सकते हैं, और आप एक गाय खा सकते हैं, दूध या पंच कर सकते हैं। इसलिए वे वस्तुएं हैं।

आपके पास एक डेटा संरचना हो सकती है जो गेंद (त्रिज्या), देश (आबादी), या गाय (लीटर में दैनिक दूध उत्पादन) के गुणों का प्रतिनिधित्व करती है, लेकिन डेटा संरचना मेरे दिमाग में किसी वस्तु का प्रतिनिधित्व नहीं करती है आप इसे बताते हैं कि प्रासंगिक व्यवहार को कैसे संसाधित करना है।

मुझे पता है कि यह परिभाषा 100% मामलों में काम नहीं कर सकती है, लेकिन यह मेरी आवश्यकताओं के लिए पर्याप्त है।

+1

मैं अपनी गायों का प्रतिनिधित्व करने के लिए प्रकार int की वस्तुओं का उपयोग करता हूं। मुझे केवल संस्करण 1 में अपने वजन को स्टोर करने की आवश्यकता है। –

+0

@ मार्टिन: अच्छी पसंद, यागनी। –

0

तकनीकी रूप से, एक वस्तु एक वर्ग का एक उदाहरण है, लेकिन वस्तुओं की वास्तविक उपयोगिता सिस्टम के डिजाइन में जानकारी और सहायता को समाहित करने की उनकी क्षमता में निहित है। वे एक विश्लेषण उपकरण हैं।

3

C++ टैग को देखते हुए, जवाब काफी पसंद है "अपनी पसंद लें।"

सी मानक किसी ऑब्जेक्ट को सार (संक्षेप में) किसी भी पते के रूप में परिभाषित करता है जिसमें मूल/आदिम प्रकार (उदा। Int) के सभी उदाहरण शामिल हैं। चूंकि सी ++ सी पर इतनी भारी निर्भर करता है, कि परिभाषा अभी भी सी ++ में कुछ वजन रखती है। इस परिभाषा के अनुसार, अनिवार्य रूप से प्रत्येक चर एक वस्तु है, और इसलिए कुछ अन्य चीजें हैं (उदा। वर्ण स्ट्रिंग अक्षर, गतिशील रूप से स्मृति के आवंटित ब्लॉक)।

स्मॉलटॉक (बल्कि विपरीत चरम पर) में जवाब उनमें से कोई भी वस्तु नहीं होगा - किसी ऑब्जेक्ट में कभी भी सार्वजनिक डेटा नहीं होता है। इसका व्यवहार पूरी तरह से संदेशों के जवाब के संदर्भ में परिभाषित किया गया है।

0

एक वस्तु एक प्रकार का एक इंस्टेंस है (चाहे वह पीओडी या कक्षा हो)।

जैसे आप किसी ऑब्जेक्ट का पता निकालने में सक्षम हैं। सभी वस्तुओं कम से कम एक बाइट लेते हैं। इसका कारण यह है कि आपको शून्य आकार वाली ऑब्जेक्ट्स को संभालने के लिए विशेष कोड जोड़ने की आवश्यकता नहीं है क्योंकि स्मृति में प्रत्येक ऑब्जेक्ट में एक कम पता है (कम से कम एक बाइट बनाकर संकलक प्रत्येक ऑब्जेक्ट के लिए स्वचालित रूप से एक अनूठा पता होगा)।

int main() 
{ 
    struct { int x; } ix; 

    struct A { A() {}; int x; }; 
    A ia; 

    ix.x = 5; // Assigned a value. 
       // Thus it has state and thus is an object. 

    ia.x = 6; // Assigned a value. 
} 

तो वे दोनों वस्तुएं हैं।

+0

तो 'int x = 6' एक वस्तु है? –

+0

@ कॉर्नेल: तो एक्स एक वस्तु है। –

+0

@ मार्टिन: मनोरंजक, अभी तक सही :) –

1

इन प्रश्नों को अतिरिक्त स्पष्टीकरण के बिना उत्तर देना असंभव है। सवाल सी ++ टैग किया गया है, जिसका अर्थ है कि भाषा माना जाता है कि सी ++ है।

इस मामले में, यदि नामस्थान स्कोप में घोषणाएं की जाती हैं, तो ix घोषणा अमान्य है। बाह्य लिंक के साथ ऑब्जेक्ट घोषित करने के लिए एक अनाम वर्ग प्रकार (जिसमें कोई संबंध नहीं है) का उपयोग करना गैरकानूनी है। ix की घोषणा स्थानीय दायरे में काम करेगा

void foo() { 
    struct { int x; } ix; // OK, no linkage 
} 

यह भी अगर ix नाम स्थान गुंजाइश

static struct { int x; } ix; // OK? Internal linkage? 

में आंतरिक लिंकेज के साथ घोषित किया गया था, हालांकि मैं व्यक्तिगत रूप से मानना ​​है कि इस बीमार का गठन किया जा करने का इरादा था काम कर सकते हैं साथ ही (Comau किसी भी तरह से इसे अनुमति देता है)।

लेकिन बाहरी लिंकेज के साथ एक नाम स्थान-गुंजाइश घोषणा बीमार का गठन

// In namespace scope 
struct { int x; } ix; // ERROR 

तो, अगर नाम स्थान गुंजाइश माना जाता है और इसके बाद के संस्करण घोषणाओं कोड के एक टुकड़े के रूप में लिया जाना चाहिए रहे हैं, वहाँ है इन सवालों के कोई सार्थक उत्तर नहीं हैं। पूरा कोड बस अमान्य है। यह व्यर्थ है। यह सी ++ नहीं है।

अन्यथा, यदि ix को कोई लिंकेज (स्थानीय) या आंतरिक लिंकेज के साथ घोषित किया गया है, तो ix एक ऑब्जेक्ट है।

ia के लिए, यह एक वस्तु है जहां इसे घोषित किया जाता है, क्योंकि कक्षा का प्रकार नाम है।

ध्यान दें कि सी ++ में ऑब्जेक्ट की धारणा कक्षाओं के साथ कुछ लेना देना नहीं है। सी ++ में ऑब्जेक्ट स्टोरेज (मेमोरी) का एक क्षेत्र है। एक उदाहरण के लिए int प्रकार का एक चर C++ में एक ऑब्जेक्ट है।

बाद में जोड़ा गया:ix घोषणा की वैधता के बारे में थोड़ा एक दिलचस्प मुद्दा है। स्पष्ट रूप से सी ++ 98 ने ऐसी घोषणाओं की अनुमति दी, जिसे DR#132 में अवैध रूप से प्रस्तावित करने का प्रस्ताव रखा गया था। हालांकि, बाद में प्रस्ताव अस्वीकार कर दिया गया था (बल्कि अजीब कारण के लिए) और चीजों को छोड़ दिया गया था। फिर भी, कॉमौ ऑनलाइन अज्ञात प्रकार के साथ बाहरी संबंध के साथ किसी ऑब्जेक्ट की घोषणा स्वीकार करने से इंकार कर देता है (आंतरिक लिंक ठीक है)। यह संभवतः कमौ कंपाइलर में औपचारिक बग हो सकता है (ऐसा नहीं है कि मैं इसके बारे में शिकायत करूंगा)।

जोड़ा भी बाद में: ओह, मैं देख रहा हूँ वहाँ एक और भी बाद में DR#389 है, जो अंत में इस तरह के घोषणाओं डाकू है, लेकिन यह डॉ की स्थिति अभी भी CD1 है।

+1

और यही कारण है कि यह * बेहद जरूरी है * जो कोई भी जानता है सी ++ प्रारंभिक सी ++ कक्षाओं के बारे में अच्छी तरह से स्पष्ट रहता है ;-) –

-1

वास्तविक उत्तर "ई। जो भी इस तरह के कोड लिखता है उसे अपनी योग्यता में सुधार करने के लिए प्रशिक्षित किया जाना चाहिए।" ठीक है, वह एक मजाक था।

यह प्रश्न इतना जटिल नहीं है। लेकिन कहीं और, मैंने प्रोग्रामिंग परीक्षणों को जानबूझकर जटिल लिखा है, यह देखने के उद्देश्य से कि क्या आप पहेली को हल कर सकते हैं। यह पूरी तरह से व्यर्थ है, क्योंकि उस जटिल कोड को नहीं होना चाहिए और आमतौर पर अस्तित्व में नहीं है। अगर इसे पढ़ना मुश्किल है, तो यह खराब लिखित कोड है।

याद रखें, कंप्यूटर के लिए कोड नहीं लिखा गया है। पढ़ने और समझने के बाद कोड अगले डेवलपर के लिए लिखा गया है।

और कोड लिखना न केवल यह काम करता है। यह एक उच्च पर्याप्त मानक नहीं है। दुनिया में सबसे खराब जंक दौड़ जाएगा, लेकिन यह ठीक करने या अपग्रेड करने के लिए एक दुःस्वप्न है।

+0

प्रोग्रामिंग परीक्षणों के लिए आपके द्वारा देखे गए कोड की जटिलता * कहीं और * कुछ भी करना है? – jalf

+0

इनमें से कौन सा सच है? ऐ बी सी डी। यह एक परीक्षण सवाल है। और वह कोड जिसे आप कहीं भी नहीं देख पाएंगे। यह स्वरूपित पूली है, इसमें कोई टिप्पणी नहीं है, आदि। यह आपको कुछ सिखाने के लिए जानबूझकर जटिल है, अवधारणा प्राप्त करने के लिए अपनी आंखों को ज़िग ज़ैग जाने के लिए मजबूर करें। तथ्य यह है कि यह उद्योग में एक antipattern का एक प्रमुख उदाहरण प्रासंगिक लगता है। – maxpolk

+0

लेकिन आपका उत्तर कहता है "कोड खराब है। असल में यह बुरा नहीं है, लेकिन मैंने खराब कोड कहीं और खराब देखा है", और फिर यह * * के बारे में एक राग में बैठता है। यह किसी भी चीज का "मुख्य उदाहरण" नहीं है, क्योंकि आप अपने प्रश्न में ऐसा कहने के लिए ऐसा हुआ कि "यह सवाल इतना जटिल नहीं है"। यदि आपकी पोस्ट * कहीं और * जटिल कोड के बारे में सोचने के बहाने से ज्यादा कुछ नहीं है, तो यह यहां ब्लॉग पर नहीं है, यहां नहीं। और यह एक "प्रमुख उदाहरण" नहीं है यदि कोड कहीं और बेहतर उदाहरण है। – jalf

1

सी ++ में "ऑब्जेक्ट" की दो सामान्य रूप से उपयोग की जाने वाली परिभाषाएं हैं।

एक सी ++ मानक के अनुसार आधिकारिक है, और कहता है कि इसके लिए आवंटित भंडारण में सबकुछ एक वस्तु है। एक संरचना एक वस्तु है, एक int एक वस्तु है, एक बूल एक वस्तु है, एक सूचक एक वस्तु है, एक स्ट्रिंग अक्षर एक वस्तु है, और इसी तरह। इस परिभाषा के अनुसार, ix, ia और x सभी ऑब्जेक्ट्स हैं। लेकिन शायद यह आपके शिक्षक का मतलब नहीं है। इस परिभाषा का उपयोग करने के लिए आपको एक भाषा वकील होना चाहिए, और यह "औसत" सी ++ उपयोगकर्ताओं के बीच व्यापक रूप से ज्ञात नहीं है। यह सिर्फ भाषा सीखने के लिए किसी भी प्रासंगिक परिभाषा नहीं है।

परिभाषा शायद ऑब्जेक्ट उन्मुख अर्थ में "ऑब्जेक्ट" का उपयोग करने की उम्मीद है। यहां (कम से कम भाषाओं के सी ++ परिवार में), एक वस्तु आमतौर पर कक्षा का एक उदाहरण होने के लिए होती है।

जो अगले स्पष्ट प्रश्न को छोड़ देता है: क्या संरचना का एक उदाहरण भी एक वस्तु है? निर्भर करता है। सी ++ में, एक वर्ग और एक संरचना अनिवार्य रूप से वही होती है, इसलिए अर्थात्, हां, लेकिन तकनीकी रूप से, आप class कीवर्ड का उपयोग नहीं कर रहे हैं, इसलिए वाक्य रचनात्मक रूप से, शायद नहीं।

संक्षेप में: यह एक मूर्ख, और बुरी तरह से सवाल किया गया प्रश्न है, और केवल आप जानते हैं कि आपके शिक्षक का क्या अर्थ है या सुनना चाहता है, क्योंकि आप ही कक्षा में भाग लेने वाले हैं, न कि हमें। हम सब कुछ अनुमान लगा सकते हैं कि पर वह सोचता है कि कक्षा को परिभाषित करता है।

+0

सी ++ परिभाषा का उपयोग करने के लिए भाषा-वकील कैसे हो रहा है, लेकिन यह कहने के लिए एक भाषा-वकील नहीं है कि यद्यपि दो अलग-अलग कीवर्ड हैं जिनका उपयोग कक्षा को परिभाषित करने के लिए किया जा सकता है, "तकनीकी रूप से" यदि आप किसी का वर्तनी नहीं करते हैं कक्षा, यह वास्तव में एक वर्ग नहीं है और इसलिए इसके उदाहरण वास्तव में वस्तुओं नहीं हैं? यदि प्रश्न का उद्देश्य छात्रों को सिखाना है कि structs * नहीं * कक्षाएं हैं, तो स्पष्ट रूप से सवाल एफआरओ ;-) –

+0

और ठीक कह रहा है, "एक int एक वस्तु है" एक परिचय में लोकप्रिय नहीं होगा सी ++ और ओओपी "कक्षा। कम से कम, जावा में इस्तेमाल किए गए लोगों में से नहीं। छोटे-छोटे या रूबी के लिए इस्तेमाल किए जाने वाले लोगों में, शायद एक सी ++ int एक (खराब, अपंग) वस्तु है, क्योंकि वस्तुएं यही होती हैं। यह सिर्फ एक वास्तव में कचरा वस्तु है, जिसमें ऑपरेटरों द्वारा निहित लोगों के अलावा कोई भी सदस्य नहीं है ;-) –

+0

यह बहुत उपयोगी परिभाषा नहीं है। सी ++ ऑब्जेक्ट्स का एकमात्र कारण एक नाम है ताकि मानक के पास "सामान है जिसमें एक प्रकार है और स्मृति में है" का संदर्भ देने का एक आसान तरीका है। सी ++ सीखने वाले लोगों के लिए यह सहायक नहीं है। यह वास्तव में आपके लिए या मेरे लिए भी उपयोगी नहीं है। इसके अलावा, फिर से, औपचारिक होने के तरीके के रूप में और मानक को वापस संदर्भित करें। इसलिए भाषा वकील टिप्पणी। "ऑब्जेक्ट" की उपयोगी परिभाषा को खोजने के लिए आपको सटीक शब्द की परवाह करना है, जो वास्तव में जानने के लिए वास्तव में उपयोगी है। – jalf

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