2009-05-07 11 views
9

में कक्षा के सार्वजनिक टाइपिफ़ेफ़ की घोषणा करें मैं आगे की घोषणाओं का उपयोग करके और स्पष्टीकरण फ़ाइल में # शामिल होने के द्वारा हेडर फ़ाइल "स्पेगेटी शामिल करें" के एक समूह को सरल बनाने की कोशिश कर रहा हूं। हालांकि, मैं इस परिदृश्य पर आते हैं:अग्रेषित करें सी ++

//Foo.h 
#include "Bar.h" 

class Foo 
{ 
public: 
    void someMethod(Bar::someType_t &val); 
}; 

//Bar.h 
. 
. 
. 
class Bar 
{ 
public: 
    typedef std::vector<SomeClass> someType_t; 
}; 

मैं दूर करने के लिए #include "Bar.h" संभव के रूप में कई मामलों में चाहते हैं। मैं उस स्थिति को भी देखता हूं जहां बार.h में टाइपपीफ बार कक्षा के बाहर सूचीबद्ध है। मुझे लगता है कि दोनों स्थितियों को उसी तरह से संबोधित किया जा सकता है।

कोई विचार?

+0

बार वास्तव में कक्षा या टेम्पलेट है? यदि बार एक टेम्पलेट है तो उत्तर अलग-अलग होंगे, यह है कि यदि बार अद्वितीय नहीं है और इस प्रकार बार :: someType_t अद्वितीय नहीं है। –

उत्तर

8

दुर्भाग्यवश आपके पास कई विकल्प नहीं हैं और कोई भी सही नहीं है।

सबसे पहले, दो स्पष्ट और अस्वीकार्य समाधान:

  • आप घोषणा typedef जो पूरी तरह से एक typedef का उपयोग करने का उद्देश्य धरा अग्रेषित कर सकते हैं।
  • आप उस फ़ाइल को शामिल करते हैं जिसमें typedef है, जिसे आप टालना चाहते हैं।

अधिक दिलचस्प समाधान:

  • सभी एक ही में संबंधित है typedef रों शामिल हैं और उस फ़ाइल में शामिल हैं। यह हालांकि कक्षाओं के बीच कोड युग्मन बनाता है। आपको केवल संबंधित वर्गों के साथ ही ऐसा करना चाहिए, अन्यथा आप एक ईश्वर के साथ समाप्त होने जा रहे हैं, जिसमें फ़ाइल शामिल है और इससे आप उस फ़ाइल में typedef जोड़ते समय बहुत अधिक recompiling का कारण बन सकते हैं।
  • प्रत्येक कक्षा के लिए, typedef एस के साथ अलग-अलग शामिल करें। कष्टप्रद की तरह, लेकिन यह काम करता है।

उन अंतिम दो आगे की घोषणाओं की तरह हैं लेकिन typedef एस के साथ। वे फ़ाइल परस्पर निर्भरता को कम करते हैं क्योंकि आप शायद ही कभी टाइप की गई फ़ाइल को संशोधित कर रहे हैं।

मैं ज्यादातर स्थितियों के लिए कहूंगा, केंद्रीय में परेशानी के लिए सबसे अधिक लाभ होता है। बस थोड़ा सावधान रहें।

+1

मुझे लगता है कि मैं 4 वां विकल्प कर सकता हूं: - Foo.h में वही सटीक टाइपपीफ घोषित करें मेरा तर्क यह है कि फू ग्राहकों के लिए अपना स्वयं का इंटरफ़ेस पेश कर रहा है, और यह जिम्मेदार है कि इसकी अपनी विधियों को कैसे कहा जाता है। क्लाइंट सॉफ़्टवेयर में बार.h शामिल नहीं होना चाहिए या इसके बारे में कोई जानकारी नहीं है। Encapsulation और कम युग्मन का यह स्तर वह लक्ष्य है जिसका लक्ष्य मैं कर रहा हूं। –

+0

ओह। मेरा मतलब 5 वां विकल्प था। –

-2

बस class Bar; का उपयोग करें। यह सी ++ बताता है कि आप बार को परिभाषित करने के अपने इरादे की घोषणा कर रहे हैं।

+1

'कक्षा बार' के अंदर टाइपिफ़ को नोट करें ... यह वास्तविक समस्या है, न कि क्लास स्वयं जिसे आपके द्वारा सुझाए गए आगे की घोषणा द्वारा संबोधित किया जा सकता है। – Naaff

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