2016-11-22 10 views
13

के रूप में आगे की घोषणा मुझे कक्षा के सी ++ आगे की घोषणा में एक गलती मिली, जिसे class Book के बजाय गलत तरीके से struct Book के रूप में घोषित किया गया था। मुझे लगता है कि पुस्तक एक संरचना के रूप में प्रयोग की जाती थी, एक वर्ग में बदल गई लेकिन आगे की घोषणाएं बनीं।संरचना बनाम वर्ग

Book.h:

class Book { 
    ... 
}; 

Library.h:

struct Book; 

class Library { 
    std::vector<Book*> books; 
}; 

कोई संकलक चेतावनी और जिसके परिणामस्वरूप कार्यक्रम थे ठीक काम करने के लिए लग रहा था। यह मुझे उत्सुक बना देता है: सिद्धांत में , क्या इससे कभी समस्या हो सकती है? यह सिर्फ एक सूचक है, हां, लेकिन उदाहरण के लिए, यदि कक्षा में वर्चुअल विधियां थीं, एकाधिक विरासत, क्या पॉइंटर्स अलग हो सकते थे?

मुझे डिफ़ॉल्ट सार्वजनिक/निजी के संबंध में कक्षा/संरचना के बीच अंतर पता है, लेकिन मैं विशेष रूप से आगे की घोषणाओं और उन्हें स्वैप करने के संभावित परिणामों के बारे में पूछ रहा हूं।

+5

यह सी ++ में कोई गलती नहीं है, लेकिन वी.एस. आप कुछ दु: ख दे सकता है। – juanchopanza

+0

@ दहन ने अंतर को समझाने के लिए प्रश्न संपादित किया। –

+0

इसी प्रकार का प्रश्न: http://stackoverflow.com/questions/4866425/mixing-class-and-struct –

उत्तर

14

struct और class जहां तक ​​आगे की घोषणाओं का संबंध है, पूरी तरह से अदलाबदल योग्य हैं। परिभाषाओं के लिए भी, वे केवल ऑब्जेक्ट सदस्यों के डिफ़ॉल्ट पहुंच विनिर्देश को प्रभावित करते हैं, बाकी सब कुछ बराबर है। आप हमेशा वस्तुओं की "कक्षाएं" परिभाषित करते हैं।

एकमात्र जगह जहां structclass से अधिक उपयोग किया जाना चाहिए, जब आगे बाइंडिंग के लिए अपारदर्शी डेटा घोषित किया जाना चाहिए।


अपने संपादित के बारे में:

मैं के बारे में डिफ़ॉल्ट सार्वजनिक/निजी वर्ग/struct के बीच मतभेदों को पता है, लेकिन मैं आगे घोषणाओं और उन्हें गमागमन के संभावित परिणामों पर विशेष रूप से पूछ रहा हूँ।

दृश्य सी ++ चेतावनी C4099 उत्पन्न करता है। ऐसा करता है, क्योंकि इसके कार्यों के लिए नाम सजावट आपके द्वारा उपयोग किए जाने वाले कीवर्ड को शामिल करती है। इसलिए, प्रोग्राम ठीक से लिंक करने में विफल रहता है। VC++ (माइक्रोसॉफ्ट के हिस्से पर एक हड्डी का कदम, AFAIC) का उपयोग करते समय तो पूरी तरह से मानक अनुपालन कोड लिंक नहीं हो सकता है।

इस चेतावनी की चर्चा है, साथ ही कारण है कि यह है, अगर आप अनुशासित हैं अनदेखा किया जा सकता के रूप में पाया जा सकता है here

+0

उत्तर के लिए धन्यवाद। दिमाग की शांति के लिए और किसी भी कंपाइलर क्विर्क और संभावित भविष्य के मनोचिकित्सक रखरखाव के क्रोध से बचने के लिए, मैं सभी आगे की घोषणाओं को मैच दूंगा। –

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