2013-09-24 6 views
7

मैं Simpletron.cpp जो एक खाली फ़ाइल है, एक Simpletron.h जो एक Simpletron वर्ग वाणी कॉल कर सकते हैं:सी में कोई कार्यान्वयन ++, लेकिन अभी भी यह

class Simpletron 
{  
public: 
    Simpletron(); 
}; 

मैं Simpletron() मेरी main.cpp में कहा जाता है:

#include <iostream> 
#include "Simpletron.h" 

int main(int argc, char *argv[]) 
{ 

    Simpletron s(); 
    std::cin.get(); 
} 

मुख्य कार्य सिर्फ किसी चेतावनी या त्रुटि के बिना सुचारू रूप से चलता है। ऐसा क्यों है? हेडर फ़ाइल से कोई कार्यान्वयन नहीं होने पर यह संकलित कैसे हो सकता है?

+4

@ Smac89: जब आप इसे घोषित नहीं। शायद मैं पागल हो रहा हूं, लेकिन कम से कम 7 अन्य लोग भी गलत हैं। इस कार्यक्रम को एक लिंकर त्रुटि का कारण बनना चाहिए, [उदाहरण] (http://ideone.com/5m0ygK)। – GManNickG

+0

@octef: कृपया अपना असली कोड और कमांड लाइन प्रदान करें। उदाहरण के लिए, आपकी कक्षा परिभाषा के बाद अर्धविराम गुम हो रहा है, इसलिए यह वह कोड नहीं हो सकता है जिसे आप संकलित कर रहे हैं। – GManNickG

+0

निश्चित रूप से, एक मिनट प्रतीक्षा करें। – octref

उत्तर

24

यह पंक्ति:

Simpletron s(); 

एक समारोह प्रोटोटाइप है,, s नाम के एक समारोह की घोषणा एक Simpletron लौटने और कोई तर्क ले जा। यह उदाहरण s नामक उदाहरण नहीं बनाता है।

अब आप पूछ सकते हैं, क्यों लिंकर बजाय न के बराबर s() समारोह के बारे में शिकायत नहीं करता है? ठीक है, के बाद से आप केवल s() की घोषणा लेकिन कभी वास्तव में यह कॉल कर रहे हैं, यह वास्तव में कहीं भी लिंक करने के दौरान, संदर्भित नहीं कर रहा है तो आप कोई लिंक त्रुटि मिलती है।

13
Simpletron s(); 

यह कार्यवाही घोषणा है, ऑब्जेक्ट इंस्टेंटेशन नहीं। खाली कोष्ठक संकलक यह बताता है समारोह कोई तर्क लेता है और मूल्य द्वारा प्रकार Simpletron की एक वस्तु देता है, इसलिए कोई कंस्ट्रक्टर्स कहा जाता है। सही सिंटैक्स पैरामीटर के बिना है:

Simpletron s; // You will get an error on this line, as initially expected 

सी ++ 11 एक वाक्य विशेषता यह है कि इस अस्पष्टता से बचा जाता है कहते हैं:

Simpletron s{}; // same as default-initialization 
+0

जहां "फिक्स" का अर्थ है लिंक-टाइम त्रुटि उत्पन्न करना। –

+0

यह इसे ठीक नहीं करेगा। यह एक त्रुटि होगी। – MahanGM

+4

@MahanGM: जहां "फिक्स" का अर्थ कोड _ को अपेक्षित_ के रूप में व्यवहार करना है। –

5
Simpletron s(); 

यह "अप्रिय पार्स" का एक क्लासिक मामला है; संकलक के लिए, आप प्रकार Simpletron के एक चर s रचना नहीं करते हैं, लेकिन आप s नाम के एक समारोह की घोषणा कर रहे हैं, कोई पैरामीटर लेने और एक Simpletron वस्तु लौटने।

इस तथ्य यह है कि इस अभिव्यक्ति एक समारोह घोषणा के रूप में और एक चर घोषणा के रूप में दोनों व्याख्या की जा सकती से आता है, परिवर्तनीय घोषित करने के बाद से एक आसान विकल्प (अर्थात्, केवल कोष्ठक छोड़ दें) मानक घोषणाओं को फ़ंक्शन घोषणा के रूप में समझने के लिए।

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

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