2013-04-05 3 views
5

सी ++, सभी मैं करना चाहता हूँ एक .h फ़ाइल में एक DisplayInfo वर्ग का ऐलान करते हैं और उसके बाद .cpp फ़ाइल में, पहले DisplayInfo::DisplayInfo() और हर समारोह परिभाषा लिखने की आवश्यकता नहीं है।यदि मैं हेडर में नेमस्पेस घोषित करता हूं तो क्या मैं .cpp फ़ाइल में क्लास नाम का उपयोग करने से बच सकता हूं?

अफसोस की बात है, मैंने अब 20 से अधिक विषयों और मेरी सी ++ पुस्तक को दो घंटे से अधिक समय तक देखा है और इसे हल करने में सक्षम नहीं हैं। मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं सी ++ में अपने 10 साल के जावा प्रशिक्षण का उपयोग करने की कोशिश कर रहा हूं।

1 परीक्षण:

//DisplayInfo.h 
namespace DisplayInfoNamespace 
{ 
    Class DisplayInfo 
    { 
    public: 
    DisplayInfo(); //default constructor 
    float getWidth(); 
    float getHeight(); 
    ... 
    }; 
} 

//DisplayInfo.cpp 
using namespace DisplayInfoNamespace; //doesn't work 
using namespace DisplayInfoNamespace::DisplayInfo //doesn't work either 
using DisplayInfoNamespace::DisplayInfo //doesn't work 
{ 
    DisplayInfo::DisplayInfo() {}; //works when I remove the namespace, but the first DisplayInfo:: is what I don't want to type 
    DisplayInfo::getWidth() {return DisplayInfo::width;} //more DisplayInfo:: that I don't want to type 
    ... 
} 

दूसरे परीक्षण के लिए, मैं आदेश स्विचन की कोशिश की, तो यह

class DisplayInfo 
{ 

    namespace DisplayInfoNamespace 
    { 
    ... 
    } 
} 

था और .cpp फ़ाइल में, प्लस

ऊपर के सभी की कोशिश की
using namespace DisplayInfo::DisplayInfoNamespace; 

तीसरे परीक्षण के लिए मैंने इसे इस शीर्षलेख के साथ घोषित करने की कोशिश की:

namespace DisplayInfoNamespace 
{ 
    class DisplayInfo; 
} 
class DisplayInfo 
{ 
public: 
...all my methods and constructors... 
}; 
मैं व्यक्त VisualStudio2010 और ध्यान से पढ़ने त्रुटि संदेश शीर्ष लेख और .cpp फ़ाइल में वर्गों और नामस्थान की सही व्यवस्था इस काम को बनाने के लिए ढूँढने में सक्षम नहीं किया गया है के बावजूद उपयोग कर रहा हूँ

और अब जब मैंने इसे टाइप करने में 30 मिनट बिताए, तो C++: "Class namespaces"? उत्तर है? (उर्फ नहीं, आपको टाइपपीफ का उपयोग करना होगा?)

उत्तर

0

A::A() परिभाषा वाक्यविन्यास को छोटा करने का कोई तरीका नहीं है, जब आप इसे कक्षा के बाहर करते हैं।

कक्षा के भीतर यह आपको सही जगह का चयन करने के लिए havinf के बिना कार्यस्थल को परिभाषित करने के लिए अनुमति देगा।

उदाहरण:

// in *.h 
namespace meh { 
    class A { 
    public: 
    A() { 
     std::cout << "A construct" << std::endl; 
    } 

    void foo(); 
    void bar(); 
    } 

    void foo(); 
} 

void foo(); 


// in *.cpp 

void foo() { 
    std::cout << "foo from outside the namespace" << std::endl; 
} 

void meh::foo() { 
    std::cout << "foo from inside the namespace, but not inside the class" << std::endl; 
} 

void meh::A::foo() { 
    std::cout << "foo" << std::endl; 
} 


namespace meh { 
    void A::bar() { 
    std::cout << "bar" << std::endl; 
    } 
} 

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

+0

धन्यवाद, लेकिन ऐसा लगता है कि इसे बाईपास करने का कोई तरीका नहीं है। क्या मैं कक्षा को .cpp फ़ाइल या कुछ में परिभाषित करना चाहता हूं? – user2247872

+0

नहीं, लेकिन यदि आप नहीं करते हैं, तो आपको यह निर्दिष्ट करना होगा कि foo() कहां से आता है (उदाहरण में)। मैं इसे साफ़ करने के लिए संपादित कर दूंगा। – scones

+0

यदि आप स्रोत फ़ाइल को डंप करने और हेडर पर चिपकने के इच्छुक हैं (जो टेम्पलेट क्लास/फ़ंक्शन को परिभाषित करते समय मामला है) तो आप अपना कार्यान्वयन शीर्षलेख में डाल सकते हैं और इस प्रकार कक्षा के दायरे को इसके सामने नहीं जोड़ना होगा कार्यों की घोषणा क्योंकि ये भी परिभाषाएं हैं। – rbaleksandar

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

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