2013-08-11 17 views
5

मैं एक निर्माता जिनके हस्ताक्षर है परिभाषित किया गया है यह है:"अपरिभाषित संदर्भ" निर्माता को जो

cpuInput (const std::string &label); 

वास्तविक निर्माता एक आरंभीकरण सूची एक superconstructor संदर्भित का उपयोग करता है, तो यह इस तरह दिखता है:

cpuInput::cpuInput (const string &label) : StateMonitor::input(label) { } 

कक्षा ऑब्जेक्ट फ़ाइल के रूप में ठीक संकलित करती है। अगर मैं एक ड्राइवर है कि निर्माता का आह्वान के साथ मिलकर उस फ़ाइल संकलन:

cpuInput *cpu = new cpuInput(); 
बेशक

मैं g++ से कोई त्रुटि मिलती है:

demo.cpp:15:31: error: no matching function for call to ‘cpuInput::cpuInput()’ 
demo.cpp:15:31: note: candidates are: 
In file included from demo.cpp:3:0: 
input_cpusage/cpuInput.hpp:7:3: note: cpuInput::cpuInput(const string&) 

अब यहाँ अजीब हिस्सा है: अगर मैं करने के लिए निर्माता कॉल बदल :

cpuInput *cpu = new cpuInput("cpu"); 

और सब कुछ एक ही छोड़ देते हैं, मैं अब मिलती है:

demo.cpp:15: undefined reference to `cpuInput::cpuInput(std::string const&)' 

मुझे लगता है कि const string&string const& के रूप में ही नहीं काफी है, लेकिन मैंने सोचा था इस सी ++ में (एक स्थिरांक चार * से इस मामले में रूपांतरण के माध्यम से,) एक स्ट्रिंग संदर्भ में उत्तीर्ण होने की मानक तरीका था, और इस:

class A { 
    public: 
     A (const string &s) : x(s) { cout << x << endl; } 
    private: 
     const string x; 
}; 

class B : A { 
    public: 
     B (const string &s) : A(s) { } 
}; 

int main (void) { 
    new B("test"); 
    return 0; 
}    

नहीं समस्या को पुनः है, हालांकि यह मेरे लिए समान WRT प्रासंगिक तत्वों लगता है।

तो क्यों एक हाथ पर जी ++ कहेंगे:

candidates are ... cpuInput::cpuInput(const string&)

फिर new cpuInput("string") को कहते हैं:

undefined reference to `cpuInput::cpuInput(std::string const&)'

+3

लगता है जैसे आप ऑब्जेक्ट फ़ाइल से लिंक नहीं कर रहे हैं, जहां 'cpuInput :: cpuInput (std :: string const &)' परिभाषित किया गया है। –

+0

@VaughnCato: तकनीकी रूप से लिंक '.o' फ़ाइल है जिसमें '.o' है, हालांकि, शायद मैं C++ lib के लिए गलत तरीके से' ar 'का आह्वान कर रहा हूं? जांच करेगा ... – delicateLatticeworkFever

+1

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

उत्तर

8

भावी पीढ़ी के लिए, मुद्दा यह है कि मैं में सुपर क्लास निर्माता (और नाशक) में परिभाषित किया गया था एक हेडर फ़ाइल - सुपरक्लास अन्यथा शुद्ध आभासी है। इसमें कोई संदेह नहीं है कि यह एक सामान्य सी ++ नौसिखिया गलती है।

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

undefined reference to subclass::subclass(...) 

हालांकि क्या मौलिक अपरिभाषित था सुपर क्लास :: सुपर क्लास()।

एक नोट के रूप में, यदि आप इसे वर्चुअल के रूप में घोषित करते हैं तो सुपरक्लास विनाशक की परिभाषा को संकलित करना भी आवश्यक है।

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