2009-04-02 37 views
23

मैं निर्माता और मेरी कक्षा का नाशक परिभाषित करने के लिए कोशिश कर रहा हूँ, लेकिन मैं त्रुटि प्राप्त हो रही करने के लिए संबंधित त्रुटि संकलन:C++ निर्माता/नाशक परिभाषा

definition of implicitly-declared 'x::x()'

इसका क्या मतलब है? कोड की

भाग:

class StackInt { 
public: 
    StackInt(); 
    ~StackInt(); 
} 

जाने के लिए संकलक क्या आप जानते डॉन:

///Constructor 
StackInt::StackInt(){ 
    t = (-1); 
    stackArray = new int[20]; 
}; 

///Destructor 
StackInt::~StackInt(){ 
    delete[] stackArray; 
} 
+0

आपकी फाइलें कैसे संरचित हैं (* .h, * .cpp)? कौन सी फाइल है जिसमें कोड पोस्ट किया गया है? – paxdiablo

उत्तर

43

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

शायद उससे अधिक घोषणा के लिए और अधिक होगा, लेकिन आपको कम से कम उन लोगों की आवश्यकता होगी - और यह आपको शुरू कर देगा।

आप बहुत ही सरल का उपयोग करके यह देख सकते हैं:

class X { 
     public: X(); // <- remove this. 
}; 
X::X() {}; 
int main (void) { X x ; return 0; } 

कि संकलित करें और यह काम करता है। फिर टिप्पणी मार्कर के साथ लाइन को हटा दें और फिर संकलित करें। आप अपनी समस्याओं तब दिखाई देगा:

class X {}; 
X::X() {}; 
int main (void) { X x ; return 0; } 

 
qq.cpp:2: error: definition of implicitly-declared `X::X()' 

+0

धन्यवाद। यह वास्तव में समस्या थी। –

+0

@ एमबी, मैं परीक्षण के दौरान एक परीक्षण कार्यक्रम पर काम कर रहा था, इसलिए मैंने सोचा कि मैं इसे एक प्रतिस्पर्धी उत्तर देने के बजाए जोड़ दूंगा जो एक ही बात कहता है। तब मैंने आपके बहुत बेहतर उत्तर को ऊपर उठाया :-) – paxdiablo

+0

संक्षिप्त और सटीक ... बहुत अच्छी तरह से किया गया। – ojblass

1

को ध्यान में रखने के लिए एक और बात यह है कि सब कुछ है कि निर्माता तक पहुँचता सार्वजनिक होना आवश्यक है। मुझे पहले यह त्रुटि मिली है।

class X{ 
    T *data; 
public:  // <-move this to include T * 
    X(); 
    ~X(); 
} 

इस कोड को अभी भी त्रुटि है क्योंकि मेरे निर्माता में मैं निम्नलिखित था:

X::X(){data = new T(); 

जिसका मतलब था कि हालांकि मैं निर्माता और नाशक सार्वजनिक, डेटा वे अभी भी था के साथ काम कर रहे थे बनाया था निजी, और मुझे अभी भी "निहित रूप से घोषित की परिभाषा" त्रुटि मिली है।

+1

यह बिल्कुल सही नहीं है। कन्स्ट्रक्टर किसी भी निजी सदस्य चर का उपयोग कर सकता है, और ऐसा करने के लिए आमतौर पर इसका अधिकांश काम होता है। –

+0

हां, कन्स्ट्रक्टर किसी भी निजी सदस्य चर का उपयोग कर सकता है, लेकिन ** केवल अपनी कक्षा का। ** इसका मतलब है कि यदि आपका कन्स्ट्रक्टर टी * डेटा के निजी चरों तक पहुंचना चाहता है तो यह सार्वजनिक होना चाहिए। – taronish4