2015-10-21 14 views
7

में कक्षा घोषित करने के लिए कैसे करें मैं आलसी गणना के साथ कक्षा बनाने की कोशिश कर रहा हूं। तो मुझे पहले गणना किए गए चर रखने के लिए संरचना की आवश्यकता है और मैं उस वर्ग को अनाम नामस्थान में रखना चाहता हूं (वैश्विक दायरे को प्रदूषित नहीं करना चाहता)। यहाँ कम से कम कोड है जो बताते हैं कि मैं क्या चाहते हैं: calculator.h:अज्ञात नेमस्पेस

#ifndef CALCULATOR_H 
#define CALCULATOR_H 

class PrevCalc; 
class Calculator 
{ 
public: 
    Calculator(); 
    PrevCalc* prevCalc; 
}; 

#endif // CALCULATOR_H 

calculator.cpp:

#include "calculator.h" 
namespace{ 
    struct PrevCalc{ 
     double prevA = -1; 
     double prevB = -1; 
     double prevC = -1; 
    }; 
} 
Calculator::Calculator() 
{ 
    prevCalc = new PrevCalc(); 
} 

बेशक यह एक त्रुटि expected type-specifier before 'PrevCalc' देता है और अगर मैं नाम स्थान के बिना PrevCalc परिभाषित सब कुछ ठीक काम करता है। मेरा प्रश्न कैसे वर्ग जो .cpp फ़ाइल में अज्ञात नाम स्थान में परिभाषित किया जाएगा

+2

एक शीर्षक में एक अनाम नाम स्थान निश्चित रूप से एक गलत डिजाइन है। –

+1

बेनामी नेमस्पेस ** उद्देश्य ** ** दायरे को फ़ाइल दायरे को सीमित करने के लिए हैं। एक नामित नेमस्पेस आपकी आवश्यकताओं को बेहतर तरीके से फिट कर सकता है। – Downvoter

+6

'प्रीवल्क' को 'कैलक्यूलेटर' की नेस्टेड स्ट्रक्चर क्यों न बनाएं? आपको गतिशील रूप से इसे आवंटित करने की आवश्यकता नहीं होगी। –

उत्तर

5

मेरे सवाल यह है कि वर्ग जो .cpp फ़ाइल

आप नहीं कर सकते में अज्ञात नाम स्थान में परिभाषित किया जाएगा घोषित करने के लिए है की घोषणा करने के लिए है। अज्ञात नामस्थान स्पष्ट रूप से वर्तमान अनुवाद इकाई के लिए निजी रूप से दिखाई देने के लिए स्पष्ट रूप से दिखाई देने वाला है, और इसका निहित रूप से आगे की घोषणाओं के लिए उपयोग नहीं किया जा सकता है।

यदि आप कार्यान्वयन विवरण छिपाना चाहते हैं तो आप शायद pimpl idiom का उपयोग कर बेहतर हो सकते हैं।


एक अन्य लोकप्रिय दृष्टिकोण एक internal_ नाम स्थान का उपयोग कर रहा है, और दस्तावेज़ यह public उपयोग के लिए नहीं है:

namespace calculators { 
namespace internal_ { 
    struct PrevCalc{ 
     double prevA = -1; 
     double prevB = -1; 
     double prevC = -1; 
    }; 
} 

class Calculator { 
public: 
    Calculator(); 
private: // !!!! 
    internal_::PrevCalc* prevCalc; 
}; 
} 
+0

समस्या यह है कि केवल एक अनाम नामस्थान आपको आंतरिक संबंध देता है। यह बहुत दुखी है, हैक के बिना पूरी तरह से आंतरिक वर्ग सदस्य (या सदस्य फ़ंक्शन) का स्वतंत्र रूप से उपयोग करने का कोई तरीका नहीं है। उम्मीद है कि मॉड्यूल में सुधार होगा! कम से कम हमारे पास मॉड्यूल-आंतरिक कक्षाएं और क्या नहीं होगा। – user362515

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