2010-04-16 13 views
7

घोषित करना चाहता हूं कि मैं किसी अन्य फ़ाइल में कक्षा के स्थिर सदस्य फ़ंक्शन को घोषित करना चाहता हूं। मुझे क्या करना चाहते हैं इस तरह दिखता है:आगे स्थिर फ़ंक्शन C++

BigMassiveHeader.h:

class foo 
{ 
    static void init_foos(); 
} 

main.cpp: अपरिभाषित प्रकार 'foo' का उपयोग:

class foo; 
void foo::init_foos(); 
int main(char** argv, int argc) 
{ 
    foo::init_foos() 
} 

इस के साथ "त्रुटि C2027 बाहर विफल रहता है "

क्या कोई ऐसा तरीका है जो मैं एक मुक्त फ़ंक्शन init_foos बनाने के साथ करना चाहता हूं, या BigMassiveHeader.h सहित? (BigMassiveHeader.h संकलन समय को प्रभावी रूप से प्रभावित कर रहा है, और हर जगह शामिल है।)

+0

में कोड शामिल करना है या नहीं .cpp या BigHeader.h में कोई प्रभाव नहीं होना चाहिए। आखिरकार, आप #include गार्ड या #pragma का उपयोग कर रहे हैं तो BigHeader.h केवल एक बार संकलित हो जाता है, है ना? – Kyte

+2

@Kyte गार्ड को शामिल करें BigHeader.h प्रति अनुवाद इकाई में एक बार जहां इसे शामिल किया गया है। यदि इसे कई स्रोत फ़ाइलों में शामिल किया जा रहा है, तो इसे कई बार संकलित करने की आवश्यकता होगी। – KeithB

+0

तो क्या 'क्लास फू' की परिभाषा को किसी अन्य शीर्षलेख फ़ाइल में विभाजित करना संभव होगा? –

उत्तर

10

आप किसी वर्ग के सदस्यों को घोषित नहीं कर सकते हैं, भले ही वे स्थिर हैं या नहीं।

+0

यह 'foo :: init_foos();' की एक और घोषणा भी नहीं है, बल्कि 'init_foos()' नामक वैश्विक फ़ंक्शन की घोषणा भी है। –

+6

कड़ाई से बोलते हुए, सी ++ पर्लान्स में "आगे घोषित" जैसी कोई शब्द नहीं है। आम तौर पर "आगे घोषित" बोलने का मतलब है "परिभाषित किए बिना घोषित करें"। इसे ध्यान में रखते हुए, एक सदस्य समारोह को "घोषित करना" संभव है। प्रत्येक बार जब आप * कक्षा को परिभाषित करते हैं, तो आप इसके [गैर-इनलाइन] सदस्य कार्यों को "आगे घोषित" कर रहे हैं। सही जवाब होगा: आप कक्षा * परिभाषित किए बिना * कक्षा के सदस्य घोषित नहीं कर सकते हैं। जेम्स मैकनेलिस का हटाया गया जवाब वास्तव में औपचारिक रूप से सही था। – AnT

+2

@AndreyT: मानक अनुभाग 27.2 का शीर्षक "फॉरवर्ड घोषणाएं" है, और टीसी ++ पीएल विशेष संस्करण में एक इंडेक्स प्रविष्टि है। –

0

नहीं, आपको इसके लिए हेडर शामिल करने की आवश्यकता है। माफ़ कीजिये।

यदि आपको जरूरी है, या कक्षा को विभाजित करें तो एक नि: शुल्क फ़ंक्शन का उपयोग करें।

4

आप अपनी कक्षा के सदस्यों को घोषित नहीं कर सकते हैं लेकिन आप उस नामस्थान के अंदर एक नामस्थान और फ़ंक्शन बना सकते हैं और आगे की घोषणा कर सकते हैं।

namespace nsfoo 
{ 
    void init_foos(); 
} 

यदि आवश्यक हो तो आपकी कक्षा इस कार्य को मित्र बना सकती है।

2

यदि आपके पास BigMassiveHeader है, तो आपको इसे SmallCompactHeaders में विभाजित करने पर विचार करना चाहिए। यदि आप व्यक्त करना चाहते हैं कि कई वर्ग और कार्य एक साथ हैं, तो आप उन्हें एक ही नामस्थान में रख सकते हैं। आप हमेशा एक सुविधा-शीर्षलेख प्रदान कर सकते हैं जिसमें आपके सभी छोटे शीर्षलेख शामिल हों।

+0

हम इस बारे में अच्छी तरह से जानते हैं। BigMassiveHeader का रिफैक्टरिंग कुछ तकनीकी ऋण है जिसे हम पूर्ववर्तियों से विरासत में मिला है, और किश्तों में भुगतान कर रहे हैं। यह वास्तव में उस प्रयास की हिम्मत है। –

0

आप आंशिक रूप से सी ++ में कक्षाएं घोषणा कर सकते हैं नहीं है, तो या तो आप अपनी ही में वर्ग की घोषणा, छोटे हेडर डाल करने के लिए होगा, या ...

शामिल करें आपकी फ़ाइल में BigMassiveHeader.h और precompiled हेडर का उपयोग करें। विजुअल सी ++ तरीका: http://msdn.microsoft.com/en-us/library/2yzw0wyd%28v=VS.71%29.aspx, या जीसीसी तरीका: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

0

मैं जानता हूँ कि यह सवाल की बात नहीं है, लेकिन अगर BigMassiveHeader.h ज्यादा समय के साथ बदलने की संभावना नहीं है, तो आप precompiled headers

0

पहली बार एक पुनर्रचना के रूप में पर एक नज़र रखना चाहिए, मैं एक नि: शुल्क का उपयोग करेंगे फ़ंक्शन जो स्थैतिक फ़ंक्शन को कॉल करता है। ऐसा नहीं है कि आपकी मुख्य विधि को कई बार बुलाया जा रहा है, इसलिए आपको एक अतिरिक्त कॉल नहीं दिखाई देगी, और इससे कम से कम मौजूदा कोड में परिवर्तन होता है।

बेशक, आप वास्तव में यह नहीं कहते कि आप क्या करने की कोशिश कर रहे हैं, केवल वही करना जो आप करना चाहते हैं। यदि आप जो करने की कोशिश कर रहे हैं उसे प्राप्त होता है जिसे एप्लिकेशन शुरू होने पर एक बार कहा जाता है, इसके लिए स्थिर ऑब्जेक्ट प्रारंभिकरण का उपयोग करें, इसे मुख्य रूप से कॉल करने के बजाय। यदि आप जो करने की कोशिश कर रहे हैं उसे प्राप्त होता है जिसे सभी स्थिर वस्तुओं के निर्माण के बाद बुलाया जाता है, तो यह अधिक जटिल होता है।

स्थैतिक वस्तु प्रारंभिकरण से, मेरा मतलब है कि यह एक .cpp फ़ाइल में ऐसा कुछ है जिसकी की परिभाषा तक पहुंच है।यह एक दोस्त और निजी एकाधिक कॉल को रोकने के लिए करें:

struct call_init_foos { 
    call_init_foos() { foo::init_foos(); } 
} call_init_foos_on_startup; 
0

एक वर्ग के एक भी विधि की घोषणा अग्रेषित करने के लिए, आप वर्ग के हिस्से के रूप विधि घोषित करना चाहिए (क्योंकि यह वास्तव में है)।

उदाहरण के लिए, आपके मामले में, main.cpp में जोड़ें:

class foo 
{ 
public: 
    static void init_foos(); 
} 

इसके नहीं सबसे सुंदर है, लेकिन यह आप पूरे हैडर शामिल करने की आवश्यकता की बचत होगी ..

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