2009-09-03 17 views
12

मैं अपने जीवन के लिए यह नहीं समझ सकता कि यह ठीक से कैसे किया जाए। - मैं एक वर्ग कुछ स्थिरांक (पाठ कि एक enum प्रकार में मूल्यों से मेल खाती है) संग्रहीत करने की आवश्यकता है कि मैं यह मेरी कक्षा में इस तरह की घोषणा (सार्वजनिक रूप से) है:स्ट्रिंग्स (सी ++) की स्थिर सरणी शुरू करना?

const static char* enumText[]; 

और मैंने इसे प्रारंभ करने में कोशिश कर रहा हूँ इस तरह:

const char* MyClass::enumText[] = { "A", "B", "C", "D", "E" }; 

हालांकि जीसीसी मुझे निम्न त्रुटि देता है:

'स्थिरांक चार * MyClass :: enumText []' 'वर्ग MyClass'

क्या बजे की एक स्थिर सदस्य नहीं है मैं गलत कर रहा हूँ? धन्यवाद!

+0

कोशिश करें: स्थिर कॉन्स char * enumText []; कक्षा मैं? –

+0

मुझे दृढ़ता से संदेह है कि यह कुछ पुराना जी ++ संस्करण है जो 'स्थिर स्थिर चार * []' 'स्थिर स्थिर * *] के रूप में 'स्थैतिक चार * []' के रूप में गलत तरीके से 'स्थिर स्थिर * *]' के रूप में गलत तरीके से व्यवहार करता है [स्थिर ' एक "असामान्य" जगह)। –

+0

क्या आप अपने उत्तर में कोड का एक पूर्ण और संकलित टुकड़ा पेस्ट कर सकते हैं जो समस्या दिखाता है? – sbi

उत्तर

13

इस कोड को संकलित करता है:

struct X { 
    static const char* enumtext[]; 
}; 

const char* X::enumtext[] = { "A", "B", "C" }; 

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

+9

लाइन 5 में 'एक्स :: enumtext' होना चाहिए या अन्यथा आप केवल एक नया चर बना रहे हैं। –

+0

वह उत्तर में एक टाइपो था, मैंने इसे सही किया है। वैसे भी, कोड जीसीसी (मैकोज़क्स में 4.0 और औबंटू में 4.3 दोनों) के साथ संकलित करता है –

+0

Wooo मुझे बेवकूफ़ लगता है, मेरे पास एक टाइपो था जिसे मैंने नोटिस नहीं किया .. –

1

जैसा कि संकलक कहते हैं, आप MyClass के एक स्थिर मेमरेर को परिभाषित करने का प्रयास कर रहे हैं जो enumText नामक एक कॉन्स char * सरणी होगी। यदि आपके पास कक्षा में इसकी घोषणा नहीं है, तो एक समस्या है।

आप होना चाहिए:

class MyClass 
{ 
    //blah 
    static const char* enumText[]; 
}; 

या हो सकता है आप एक स्थिर सदस्य चाहते हैं हमारा इस तरह। यदि नहीं, तो आपको नाम में कक्षा का उपयोग नहीं करना चाहिए।

वैसे भी, जिसमें सरणी intialization के साथ कुछ भी नहीं है।

+0

ओप कहते हैं, "मैंने इसे अपनी कक्षा में सार्वजनिक रूप से घोषित किया है ( – snarf

+0

@ सर्नफब्लैम: लेकिन अक्सर ओपी क्या कहता है और वास्तविकता 2 अलग-अलग चीजें होती है - खासकर जब से वह कहता है कि उसने क्या किया है। –

1

निम्नलिखित कोड मेरे लिए ठीक संकलित वी.एस. 2005 में:

class MyClass 
{ 
const static char* MyClass::enumText[]; 
}; 
const char* MyClass::enumText[] = { "A", "B", "C", "D", "E" }; 

अगर मैं एक जंगली अनुमान लेना पड़ा, मैं कहता हूँ हैं, जो आपके initilization लाइन एक अलग स्रोत फ़ाइल में है, और आप भूल गया #। फ़ाइल को शामिल करें जिसमें MyClass शामिल है। यह वही चीज है जिसे मैंने पेंच किया और हर समय किया।

इसके अलावा, मुझे लगता है कि आपके पास गलत जगह (या उनमें से पर्याप्त नहीं) में कॉन्स है। जिस तरह से आपके पास अब है, यह सरणी नहीं है, या सरणी में पॉइंटर्स; बस इसके भीतर चरित्र तत्व।

6

यह जीसीसी संस्करण 4.0.1 के साथ संकलित:

g++ -Wall -Wextra -pedantic s.cc -o s 

आप यह सुनिश्चित करें कि MyClass::enumText सही वर्ग संदर्भित कर रहा है कर रहे हैं:

#include <iostream> 

class MyClass { 
public: 
    const static char* enumText[]; 
}; 

const char* MyClass::enumText[] = { "a", "b", "c" }; 

int main() 
{ 
    std::cout << MyClass::enumText[0] << std::endl; 
} 

साथ संकलित?

2

त्रुटि संदेश को देखते हुए, मुझे लगता है कि आपके पास MyClass कहीं और (किसी अन्य शीर्षलेख में शायद?) की घोषणा है जिसमें enumText [] घोषित नहीं है। त्रुटि संदेश इंगित करता है कि संकलक MyClass के बारे में जानता है, लेकिन यह enumText सदस्य के बारे में नहीं जानता है।

मैं यह देखने के लिए देखता हूं कि आपके पास छाया में छिपकर MyClass की कई घोषणाएं हैं या नहीं।

क्या आप wintermute's या T.E.D.'s संकलन के उदाहरण प्राप्त कर सकते हैं?

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