2008-10-29 12 views
11

में परिभाषित कक्षा में विधि जोड़ने विधि मुझे आश्चर्य है कि हेडर फ़ाइल में परिभाषित मौजूदा वर्ग में मुख्य प्रोग्राम में विधियों को जोड़ना संभव है या नहीं। उदाहरण के लिए: वहाँ class CFun फ़ाइल CFun.hpp में परिभाषित किया गया है, लेकिन हमारी party.cpp में हम संपादन CFun.hppसी ++ हेडर फ़ाइल

जाहिर है बिना एक विधि void hello() {cout << "hello" << endl;}; जोड़ना चाहते हैं (दुर्भाग्य से) निर्माण:

#include "CFun.hpp" 

class CFun 
{ 
    public: 
    void hello() {cout << "hello" << endl;}; 
}; 

एक लौटने काम नहीं करता है त्रुटि Multiple declaration for 'CFun'

क्या यह कक्षा विरासत के बिना काम करना संभव है?

उत्तर

9

नहीं है, लेकिन आप एक विधि है कि एक CFun वर्ग के लिए एक संदर्भ/सूचक लेता है जोड़ सकते हैं तो आप सिर्फ निजी डेटा तक पहुंच नहीं होगी, जो

void Hello(CFun &fun) 
{ 
    cout << "hello" << endl; 
} 

यह शायद सबसे अच्छा तुम हो जाएगा है कर सकने योग्य। जैसा कि litb द्वारा इंगित किया गया है - यह फ़ंक्शन CFN के समान नामस्थान में होना चाहिए। सौभाग्य से, वर्गों के विपरीत, नामस्थान, कई स्थानों पर जोड़ा जा सकता है।

+1

तुम उसे बताना चाहिए समारोह की तरह एक ही नाम स्थान में होने की जरूरत है कक्षा। अन्यथा सिर्फ हैलो (some_cfun) को कॉल करना; हैलो नहीं मिलेगा। आपको foo :: हैलो (some_cfun) लिखना होगा; तब (एडीटी तब काम नहीं करेगा) –

0

मेरे ज्ञान के लिए नहीं। हालांकि, आप किसी तरह की जूरी-रिगिंग कर सकते हैं और नेमस्पेस-वाई समाधान बना सकते हैं। -

3

नहीं, यह संभव नहीं है। केवल किसी विशेष वर्ग की एक परिभाषा हो सकती है, और इसे एक पूर्ण परिभाषा होनी चाहिए, जिसका अर्थ है कि आप अलग-अलग स्थानों में आंशिक परिभाषाएं नहीं रख सकते हैं, जिससे कक्षा में सदस्यों को जोड़ना पड़ता है।

यदि आपको कक्षा में सदस्य फ़ंक्शन जोड़ने की आवश्यकता है, तो आपको कक्षा परिभाषा (CFun.hpp संपादित करें) को बदलना होगा, या CFun से एक नई कक्षा प्राप्त करनी होगी और वहां hello() डालें।

0

इसके बारे में सोचने के बाद, आप कुछ भयानक काम कर सकते हैं: सीएफयूएन में कुछ फ़ंक्शन ढूंढें जिसमें आपके पास एक वापसी प्रकार है, और केवल पूरे शीर्षलेख में उल्लेख किया गया है। मान लें void GoodBye()

अब इस सामग्री के साथ एक फ़ाइल CFunWrapper.hpp बनाएँ:

#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye() 
#include "CFun.hpp" 
#undef GoodBye 

तब ही कभी CFun.hpp के बजाय CFunWrapper.hpp शामिल हैं।

लेकिन ऐसा न करें, जब तक ऐसा करने के लिए वास्तव में कोई अच्छा कारण न हो। CFun.hpp की सामग्री के आधार पर, यह तोड़ने के लिए बेहद प्रवण है, और संभव भी नहीं हो सकता है।

+0

ऐसा करना सिर्फ CFun.hpp को संशोधित करने जैसा ही है। ऐसी स्थिति के बारे में सोचना बहुत मुश्किल है जहां यह काम करेगा, लेकिन आप हेडर फ़ाइल को बदल नहीं सकते हैं। मुझे लगता है कि यह एक आरओएफएस पर हो सकता है। –

2

सी ++ में उस तरह के निर्माण (पूर्वनिर्धारित कक्षाओं में कार्यक्षमता जोड़ने) के निकटतम एनालॉग सजावटी पैटर्न है। यह ठीक नहीं है कि आप क्या कर रहे हैं, लेकिन यह आपको जो भी चाहिए उसे करने की अनुमति दे सकता है।

0
class Party : class CFun 

(अपने party.cpp)

नमस्ते() फ़ंक्शन सहित CFun सामान, इनहेरिट करती है।

तो ...

Party p; 
p.hello(); 

नहीं?

2

यह विरासत के लिए एक स्पष्ट उपयोग-मामले की तरह लगता है। एक नया वर्ग को परिभाषित करें:

#include "CFun.hpp" 

class CFun2 : public CFun 
{ 
    public: 
    void hello() {cout << "hello" << endl;}; 
}; 

फिर अपने स्रोत कोड में CFun2 बजाय CFun का उपयोग करें।

4

आप इस तरह वर्ग को फिर से परिभाषित कर सकते हैं:

#define CFun CLessFun 
#include "CFun.hpp" 
#undef CFun 

class CFun : CLessFun 
{ 
    public: 
    void hello() {cout << "hello" << endl;}; 
}; 

एक नया हेडर फाइल CMoreFun.hpp में इस रखो और शामिल है कि बजाय CFun.hpp