c++ - Classes have not been declared but they were included? -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 8 जवाब
मेरे पास ये दो वर्ग हैं एक दूसरे की जरूरत है और एक ही कक्षा से विरासत में मिला है। Wehn मैं Seller.h संकलन, यह ठीक संकलित है, लेकिन जब मैं Buyer.h संकलन। मैं विक्रेता से त्रुटियाँ हो एच।
तो जब मैं Buyer.h संकलन मैं जैसे त्रुटियाँ मिल:
< Pre> Seller.h: 14: 16: त्रुटि: œबॉयर को शून्य ऐडब्यूर घोषित नहीं किया गया है (खरीदार *); ^ विक्रेता.h: 15: 14: त्रुटि: इस क्षेत्र में घोषित नहीं किया गया था std :: vector & lt; क्रेता * & gt; GetBuyers () कॉन्स्ट; विक्रेता.h: 20: 17: त्रुटि: 'ऑर्डर' को रिकॉर्डेबल ऑर्डर ऑर्डर घोषित नहीं किया गया है (ऑर्डर *); ^
वे # शामिल हैं लेकिन यह अभी भी दायरे से बाहर है।
#ifndef SELLER_H #define SELLER_H #include "Entity.h" #include & lt ; स्ट्रिंग & gt; #include & lt; vector & gt; #include "inventory.h" #include "Order.h" वर्ग विक्रेता: सार्वजनिक वर्चुअल इकाई {सार्वजनिक: विक्रेता (const std :: string & amp ;, const std :: string &, double = 0.0); वर्चुअल ~ विक्रेता () {} शून्य addBuyer (खरीदार *); std :: वेक्टर & LT; क्रेता * & gt; GetBuyers () कॉन्स्ट; शून्य सेट इन्वेंटरी (इन्वेंटरी *); इन्वेंटरी * getInventory () कॉन्स्ट; वर्चुअल शून्य सूची () const ओवरराइड; वर्चुअल शून्य चरण () ओवरराइड; शून्य भर ऑर्डर (ऑर्डर *); निजी: इन्वेंटरी * inv; Std :: vector & lt; क्रेता * & gt; खरीदारों; }; #endif
Buyer.h
<पूर्व> #ifndef BUYER_H #define BUYER_H #include & lt; स्ट्रिंग & gt; #include "Entity.h" #include & lt; queue & gt; # शामिल "Order.h" # "विक्रेता एच" वर्ग खरीदार शामिल करें: सार्वजनिक वर्चुअल इकाई {सार्वजनिक: खरीदार (const std :: string &, const std :: string &, double = 0.0); वर्चुअल ~ खरीदार () {} शून्य addSeller (विक्रेता *); Std :: queue & lt; विक्रेता * & gt; GetSellers () कॉन्स्ट; शून्य addOrder (ऑर्डर *); Std :: queue & lt; आदेश * & gt; GetOrders () कॉन्स्ट; वर्चुअल शून्य सूची () const ओवरराइड; वर्चुअल शून्य चरण () ओवरराइड; निजी: std :: queue & lt; आदेश * & gt; आदेश; Std :: queue & lt; विक्रेता * & gt; विक्रेताओं; }; #endif
आपके पास विक्रेता
के बीच एक चक्रीय निर्भरता है और क्रेता
। यह कभी काम नहीं करेगा क्योंकि कंपाइलर को विक्रेता
को क्रेता
को संकलित करने की घोषणा की आवश्यकता है ... फिर भी खरीदार
की घोषणा की आवश्यकता है संकलन विक्रेता
।
आप इसके बजाय अपनी कक्षाओं को घोषित कर सकते हैं क्योंकि वास्तव में आप वास्तव में इन प्रकारों के संकेत देते हैं उदाहरण के लिए:
<पूर्व> #ifndef SELLER_H #define SELLER_H #include "Entity.h" #include & lt; स्ट्रिंग & gt; #include & lt; vector & gt; #include "inventory.h" # शामिल "Order.h" // क्रेता वर्ग खरीदार के आगे घोषणा; वर्ग विक्रेता: सार्वजनिक वर्चुअल इकाई {सार्वजनिक: विक्रेता (कॉन्स्ट स्ट्रोड :: स्ट्रिंग & amp;; const std :: स्ट्रिंग &, डबल = 0.0); वर्चुअल ~ विक्रेता () {} शून्य addBuyer (खरीदार *); std :: वेक्टर & LT; क्रेता * & gt; GetBuyers () कॉन्स्ट; शून्य सेट इन्वेंटरी (इन्वेंटरी *); इन्वेंटरी * getInventory () कॉन्स्ट; वर्चुअल शून्य सूची () const ओवरराइड; वर्चुअल शून्य चरण () ओवरराइड; शून्य भर ऑर्डर (ऑर्डर *); निजी: इन्वेंटरी * inv; Std :: vector & lt; क्रेता * & gt; खरीदारों; }; #endif
यदि आपके पास खरीदार
का एक उदाहरण विक्रेता
(अर्थात, क्रेता _ब्यूयर; ), या यदि किसी भी विधि ने
खरीदार
का एक उदाहरण लिया है / लौटा दिया है, तो आपको अपनी संरचना बदलने के लिए मजबूर किया जाएगा। चूंकि आपको यह समस्या नहीं है, इसलिए आगे की घोषणा पर्याप्त होगी।
एक तरफ के रूप में, और स्वीकार कर रहा हूं कि मैं आपके प्रोग्राम की संरचना के लिए नहीं हूं, यह आमतौर पर एक बुरा संकेत है एक सी + + कार्यक्रम में इस्तेमाल किया जा रहा है इतने सारे नग्न संकेत देखता है आप उदाहरणों को स्टोर कर सकते हैं आप अपने स्वामित्व शब्दों के आधार पर सुरक्षित संकेत ( shared_ptr
और unique_ptr
) का उपयोग कर सकते हैं।
उदाहरण के लिए, addBuyer
आसानी से एक संकेतक के बजाय एक खरीदार और
ले सकता है। अब आपको अमान्य संकेतों के बारे में चिंता करने की ज़रूरत नहीं है मैं मान रहा हूं कि आप अपने खरीदारों
वेक्टर में इन्हें जोड़ते हैं ... लेकिन आप यह कैसे गारंटी दे रहे हैं कि ये संकेतक एक विक्रेता
उदाहरण के जीवनकाल के लिए वैध हैं? आप नहीं कर सकते; आप जिसे जिसे addBuyer कहा जाता है
की दया पर हैं
क्यों न सिर्फ एक std :: vector & lt; क्रेता & gt;
स्टोर करें और अपने ऐड मेथड में संदर्भ लें? क्या इस प्रतिरूपी की लागत इतनी निषेधात्मक है कि इस डिजाइन का आश्वासन दिया जाए? यदि हां, तो क्या आप shared_ptr
?
Comments
Post a Comment