2012-10-02 24 views
7

संभव डुप्लिकेट है:
Why is there no call to the constructor?टेस्ट टी के बीच अंतर क्या है; और टेस्ट टी() ;? यदि टेस्ट एक वर्ग

मैं Visual Studio 2012 का उपयोग कर रहा, मान लीजिए टेस्ट एक वर्ग

class Test 
{ 
}; 

जब मैं एक नया उदाहरण बनाने है परीक्षण के, निम्नलिखित दो तरीकों का अंतर क्या है?

रास्ता 1

Test t; 

रास्ता 2

Test t(); 

मैं नीचे दिए गए कोड में यह सवाल है, मूल रूप से, मैं एक का एक उदाहरण रास्ता 2 में परिभाषित, मैं केवल एक त्रुटि मिली क्योंकि बी एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान नहीं करता है, लेकिन जब मैं इसे 1 तरीके से परिभाषित करता हूं, तो मुझे एक अतिरिक्त त्रुटि मिली।

class B 
{ 
    B(int i){} 
}; 

class A 
{ 
    A(){} 
    B b; 
}; 

int main(void) 
{ 
    A a(); // define object a in way 2 

    getchar() ; 
    return 0 ; 
} 

अगर मैं रास्ते में एक परिभाषित 1

A a; 

मुझे मिल जाएगा एक और त्रुटि कहा

त्रुटि C2248: 'एक :: ए': निजी सदस्य कक्षा में घोषित उपयोग नहीं कर सकते 'ए'

तो मुझे लगता है कि वहाँ होना चाहिए कुछ मतभेद हो दो तरीकों के बीच।

उत्तर

50

enter image description here

Test t; एक चर प्रकार Test की t बुलाया परिभाषित करता है।

Test t();t नामक एक फ़ंक्शन घोषित करता है जो कोई पैरामीटर नहीं लेता है और Test देता है।

+20

+1 :-) –

+1

अच्छा, क्या एक बेवकूफ सवाल है, मुझे यकीन है कि मुझे पहले पता है, लेकिन ... आज मेरा दिन नहीं है :( – zdd

+0

@zdd ऐसा होता है। –

17

दो घोषणाओं के बीच अंतर क्या है?

A a(); 

एक समारोह और नहीं एक वस्तु की घोषणा:। यह C12+ में Most vexing parse में से एक है।
यह a नाम से एक फ़ंक्शन घोषित करता है जो कोई पैरामीटर नहीं लेता है और A टाइप करता है।

A a; 

उसके डिफ़ॉल्ट निर्माता को फोन करके प्रकार A की a नाम के एक वस्तु बनाता है।

आपको संकलन त्रुटि क्यों मिलती है?

एक वर्ग डिफ़ॉल्ट पहुँच विनिर्देशक के लिए क्योंकि आपके वर्ग निर्माता private है और इसके बाद के संस्करण वाक्य रचना के साथ वस्तु बनाने के दौरान यह नहीं कहा जा सकता private तो आप त्रुटि मिलती है।

+0

आपको बहुत बहुत धन्यवाद। चित्र के लिए – zdd

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