2011-09-27 16 views
11

संभव डुप्लिकेट:
C++ static constant string (class member)
static const C++ class member initialized gives a duplicate symbol error when linkingमैं सी ++ में स्ट्रिंग स्थिरांक कैसे परिभाषित करूं?

साथ मेरा अनुभव सी ++ बीमारी के स्ट्रिंग वर्ग के अलावा, इसलिए मैं कुछ मायनों में से शुरू कर रहा हूँ।

मैं अपनी कक्षा के लिए अपनी हेडर फ़ाइल को परिभाषित कर रहा हूं और एक यूआरएल के लिए स्थिर स्थिरता बनाना चाहता हूं। मैं निम्नानुसार ऐसा करने का प्रयास कर रहा हूं:

#include <string> 
class MainController{ 
private: 
    static const std::string SOME_URL; 
} 

const std::string MainController::SOME_URL = "www.google.com"; 

लेकिन यह मुझे लिंक के दौरान एक डुप्लिकेट परिभाषा देता है।

मैं इसे कैसे पूरा कर सकता हूं?

+0

डुप्ली http://stackoverflow.com/questions/2888805/static-const-c-class-member-initialized-gives-a-duplicate-symbol-error-when-lin –

उत्तर

10

एक cpp फाइल करने के लिए

const std::string MainController::SOME_URL = "www.google.com"; 

ले जाएँ। यदि आपके पास हेडर में है, तो प्रत्येक .cpp जिसमें इसमें शामिल होगा, एक प्रतिलिपि होगी और आपको लिंक के दौरान डुप्लिकेट प्रतीक त्रुटि मिलेगी।

+1

मुझे लगता है कि मुझे समझ में नहीं आता कि मेरे पास ये हैडर गार्ड के भीतर हैं। इससे समस्या ठीक हुई, मुझे समझ में नहीं आया कि क्यों ... – Thom

+3

@ थॉम, समस्या हेडर गार्ड के साथ हल नहीं होती है क्योंकि प्रत्येक अनुवाद इकाई (सीपीपी फ़ाइल) में हेडर शामिल होता है ताकि प्रत्येक अनुवाद इकाई 'प्रतिलिपि' एक ही नाम के साथ स्ट्रिंग का, परिणाम यह है कि प्रत्येक अनुवाद इकाई सही ढंग से संकलित होती है। हालांकि, एकाधिक अनुवाद इकाइयों को जोड़ने पर एक ही प्रतीक (स्ट्रिंग) होता है और जो प्रतीकात्मक लिंक के कारण लिंक त्रुटि को उत्तेजित करता है। –

2

आपको const std::string MainController::SOME_URL = "www.google.com"; परिभाषा को एक एकल स्रोत फ़ाइल में रखना चाहिए, शीर्षलेख में नहीं।

2

हेडर फाइल में वर्ग को परिभाषित करें:,

//file.h 
class MainController{ 
private: 
    static const std::string SOME_URL; 
} 

और फिर स्रोत फ़ाइल में:

//file.cpp 
#include "file.h" 

const std::string MainController::SOME_URL = "www.google.com"; 
9

आप सीपीपी फ़ाइल में लाइन

const std::string MainController::SOME_URL = "www.google.com"; 

लगाने की जरूरत है , one-definition rule की वजह से हेडर नहीं। और तथ्य यह है कि आप कक्षा में इसे सीधे शुरू नहीं कर सकते हैं क्योंकि std::string एक अभिन्न प्रकार (int की तरह) नहीं है।

वैकल्पिक रूप से, आपके उपयोग के मामले के आधार पर, आप एक स्थिर सदस्य नहीं बना सकते हैं बल्कि इसके बजाय अनाम नामस्थान का उपयोग कर सकते हैं। See this post for pro/cons

+0

भले ही यह अभिन्न प्रकार है, यह होगा त्रुटि दें यही है, स्थिर सदस्य के * प्रकार * के साथ इसका कोई संबंध नहीं है; जब तक आप शीर्षलेख में सदस्य की * परिभाषा * प्रदान करते हैं, तो यह त्रुटि देगा। अभ्यास में – Nawaz

+1

@ नवाज। औपचारिक रूप से, अंतर अनुवाद इकाइयों में कई परिभाषाएं अनिर्धारित व्यवहार है, इसलिए एक कंपाइलर इसे काम कर सकता है। (या कुछ और करें, लेकिन "इसे काम करें" सी में एक आम कार्यान्वयन था जहां रचनाकारों ने इसमें प्रवेश नहीं किया था।) –

+1

@ जेम्ससांज: आप क्या कहने की कोशिश कर रहे हैं? यह स्थिर सदस्य के * प्रकार * के साथ क्या करना है? – Nawaz

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