2012-12-28 21 views
5

में मिलाएं, सबसे पहले, मेरी अंग्रेजी के लिए खेद है।दो या दो से अधिक C++ नामस्थानों को एक

ठीक है, मैं एक प्रोग्राम काम कर रहा हूं जो एक विशिष्ट प्रक्रिया करता है। इस प्रक्रिया को परिभाषित करने के लिए कुछ वर्गों और कार्यों की आवश्यकता है। उन सभी को एक्सेस करने के लिए ब्लॉक में व्यवस्थित किया जाना चाहिए।

मेरा पहला विचार नामस्थान (C++) के साथ काम करने, कुछ इस तरह मिल गया था:

namespace LoadSystem 
{ 
    namespace ParseBlock1 
    { 
     class ClassA {...} 
     class ClassB {...} 
     class ClassC {...} 
    } 
    namespace ParseBlock2 
    { 
     class ClassA {...} 
     class ClassB {...} 
     class ClassC {...} 
    } 
} 

तो, मैं अगर यह अच्छा है या नहीं सबसे अच्छा विचार प्राप्त करने के पढ़ रहा था। मैंने पहले ही पढ़ा है कि मुझे बहुत से नेस्टेड नेमस्पेस का उपयोग नहीं करना चाहिए, इसलिए, मेरे उद्देश्य के लिए, ऊपर दिखाए गए अनुसार न्यूनतम स्तर दो हैं।

मेरा उद्देश्य LoadSystem नामस्थान में अधिक से अधिक जोड़ने में सक्षम होना है। यह एक .h फ़ाइल में संग्रहीत किया जाएगा, इसलिए, कक्षाओं के केवल इंटरफेस होंगे। चूंकि प्रति ब्लॉक बहुत सारे वर्ग हो सकते हैं, इसलिए मैं प्रत्येक ब्लॉक की परिभाषा को अन्य .h फ़ाइलों में विभाजित करना चाहता हूं ताकि मुख्य .h फ़ाइल छोटा हो सके।

तो, मैं एक फ़ाइल block1.h और block2.h, इस तरह की एक संरचना के साथ हर एक को परिभाषित करने की एक विचार के साथ खत्म हुआ:

namespace LoadSystem 
{ 
    namespace ParseBlock1 
    { 
     class ClassA {...} 
     class ClassB {...} 
     class ClassC {...} 
    } 
} 

और

namespace LoadSystem 
{ 
    namespace ParseBlock2 
    { 
     class ClassA {...} 
     class ClassB {...} 
     class ClassC {...} 
    } 
} 

और उनमें load_system.h फ़ाइल में आयात करते हैं। इसलिए, हर बार मुझे एक और ब्लॉक जोड़ने की ज़रूरत होती है, मैं आवश्यक फाइलें लिखता हूं, और आखिरकार, मैं केवल blockX.h को मुख्य load_system.h में आयात करता हूं।

फिर, मैं LoadSystem::ParseBlock1::Class1 या LoadSystem::ParseBlock2::Class1 का उपयोग कर उसी नामस्थान से दोनों ब्लॉक तक पहुंचने में सक्षम होना चाहिए।

मैंने इसे सरल पूर्णांक मानों के साथ परीक्षण किया है और यह काम करता है। नामस्थान गठबंधन करते हैं और मैं बिना किसी चेतावनी के मूल्यों तक पहुंच सकता हूं (मैंने gcc -Wall -Werror -Wextra -pedantic का उपयोग किया)।

तो, नामस्थानों का यह संयोजन सही है या नहीं। शायद यह काम करता है, लेकिन शायद मुझे इसका उपयोग नहीं करना चाहिए, मुझे नहीं पता।

इसके अलावा, मैं जानना चाहता हूँ अगर, एक "मास्टर" हेडर फाइल (जो अन्य हेडर फाइल का आयात करता है) आयात करने की इस प्रक्रिया को भी सही है या नहीं (मैं से रक्षा करने के लिए आवश्यक #ifndef, #define और #endif मैक्रो का उपयोग कर रहा हूँ एकाधिक आयात), मैं इस तरह कुछ उपयोग कर रहा हूं:

# ifndef LOAD_SYSTEM_H_ 
# define LOAD_SYSTEM_H_ 

# include "block1/block1.h" 
# include "block2/block2.h" 

# endif 

तो, कृपया यह जानने में मेरी सहायता करें कि यह सही है या नहीं।

सभी के लिए धन्यवाद।

+2

जहां तक ​​मैं कह सकता हूं, यह नामस्थानों का उपयोग करने का एक बिल्कुल सही तरीका है। आप उनमें से कई हो सकते हैं और समानांतर में, कोई समस्या नहीं कर सकते हैं। (जो मुझे नहीं पता है कि क्या आपको वास्तव में इन सभी नामस्थानों की आवश्यकता है; यह समझना मुश्किल है कि सभी वर्ग क्या करते हैं और उनका उपयोग कैसे किया जाता है।) – jogojapan

+1

आपकी अंग्रेजी बहुत अच्छी है। मैंने अपनी आवृत्ति को कम करने और स्वरूपण के लिए कुछ मामूली संपादन किए। – wallyk

+0

jogojapan: धन्यवाद, मैं अंत में (जवाब पढ़ रहा हूं) समझता हूं कि "संयोजन" की यह प्रक्रिया एक गलती नहीं है। धन्यवाद। wallyk: ठीक है, डिजाइन कुछ तार्किक वास्तुकला निर्दिष्ट करता है, इसलिए, मुझे लगता है कि मुझे कोड पर उस आर्किटेक्चर का प्रतिनिधित्व करने की कोशिश करनी चाहिए: पी, लेकिन यहां जवाब पढ़ना, और नामस्थानों की स्थिति और प्रकृति को और सोचना, मुझे लगता है कि मैं केवल एक स्तर का प्रबंधन करेगा: पी (कार्यक्रम का नाम, कुछ समय जैसे MySystem :: कक्षा 1, MySystem :: Class2, आदि)। –

उत्तर

2

आप हमेशा मौजूदा नामस्थान का विस्तार कर सकते हैं, ताकि हिस्सा ठीक हो।

और वह हिस्सा केवल एकमात्र तकनीकी उत्तर है।

"मास्टर हेडर फ़ाइल" के संबंध में, यह व्यक्तिगत वरीयता का विषय है, यह अधिक व्यक्तिपरक है। मैं पसंद करता हूं कि शामिल हेडर को बिना किसी शर्त के अपने आप में शामिल किया जा सकता है (जैसे उनके सामने अन्य सामान भी शामिल है)।यदि ऐसा है, तो मेरे लिए सब ठीक है, लेकिन यदि नहीं, तो आपके कोड के उपयोगकर्ताओं को अभ्यास में कुछ छोटे छोटे हेडर प्राप्त करने के लिए बड़ी मास्टर हेडर फ़ाइल शामिल करनी होगी, और इससे निर्माण के समय नकारात्मक हो सकते हैं (और यदि वे डॉन करते हैं टी नहीं, लेकिन स्वयं में पूर्वापेक्षाएँ शामिल हैं, फिर उनके पास भंगुर कोड है जो हेडर अपडेट करते समय काम करना बंद कर सकता है)।

+0

उत्तर के लिए बहुत बहुत धन्यवाद। जैसा कि मैंने उपरोक्त कहा है, अब मैं केवल एक स्तर के नामस्थान (प्रोग्राम नाम) के साथ काम करने की कोशिश करूंगा। और हाँ, मैं समझता हूं कि कोड कोड में बहुत से शीर्षलेख आयात करने से संकलन समय और शायद, द्विआधारी आकार भी प्रभावित होता है। इसलिए, मैं प्रत्यक्ष आयात कॉल के साथ काम करने की कोशिश करूंगा (मास्टर हेडर फ़ाइल के बजाय कक्षा फ़ाइलों को आयात करना)। सहायता के लिए धन्यवाद: डी –

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