2013-03-12 23 views
6

ग पर हाय iam शुरुआत ++ मैं स्थिर तरीकों के साथ वर्ग है और मैं नहीं कर सकते उन तक पहुँच यह मुझे एक त्रुटि फेंकतासी ++ अनसुलझे बाह्य प्रतीक

1>------ Build started: Project: CPractice, Configuration: Debug Win32 ------ 
1> Source.cpp 
1>Source.obj : error LNK2001: unresolved external symbol "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > CPractice::name" ([email protected]@@[email protected]?$char_trait[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@A) 
1>c:\users\innersoft\documents\visual studio 2012\Projects\CPractice\Debug\CPractice.exe : fatal error LNK1120: 1 unresolved externals 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

और यहाँ मेरे कोड है

#include <iostream> 
#include <stdio.h> 
#include <cstdlib> 
#include <string> 

using namespace std; 

class CPractice 
{ 
    public: 
     static void setName(string s) 
     { 
      name = s; 
     } 
     static string getName() 
     { 
      return name; 
     } 
    private: 
     static string name; 
}; 


int main() 
{ 


    CPractice::setName("Name"); 
    cout << "\n" << CPractice::getName(); 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

उत्तर

18
static string name; 

चूंकि यह static है, यह लाइन केवल name घोषित करती है - आपको इसे भी परिभाषित करने की आवश्यकता है। बस अपने वर्ग की परिभाषा नीचे रखें:

string CPractice::name; 

आप अंत तो एक इसी शीर्षक और कार्यान्वयन फाइल करने के लिए अपनी कक्षा चलती है, तो आप कार्यान्वयन फ़ाइल में इस परिभाषा का ध्यान रखें। इसे केवल एक अनुवाद इकाई में परिभाषित किया जाना चाहिए।

+0

मैंने सोचा कि अपने allready परिभाषित जब मैं यह घोषणा की। इसके काम, बहुत बहुत धन्यवाद –

+1

@ सिल्वियो मारिजिक यह लोगों की एक आम गलती है। एक परिभाषा नहीं है क्योंकि कई परिभाषाओं से बचने के लिए है। यदि यह एक परिभाषा थी और आपने हेडर को शामिल किया था तो यह कई अन्य फाइलों में था, तो आपके पास एक ही स्थिर सदस्य की कई परिभाषाएं होंगी। वैसे भी, उस उत्तर को स्वीकार करके धन्यवाद कहना न भूलें जिसने आपको सबसे ज्यादा मदद की। –

1

मुझे लगता है कि आप gcc के साथ संकलित करने का प्रयास कर रहे हैं, जब आपको g++ के साथ संकलित करना चाहिए। इस पर अधिक के लिए What is the difference between g++ and gcc? देखें।

आपको अपनी कक्षा परिभाषा के नीचे string CPractice::name; जोड़ने की भी आवश्यकता है।

string CPractice::name ="hello" ; 
1

आप केवल कक्षा में name घोषित, स्थैतिक चर वर्ग के बाहर तो जैसे परिभाषित करने की आवश्यकता है डिफ़ॉल्ट उदाहरण संबंधित कन्स्ट्रक्टर पर।

वर्ग परिभाषाओं के बाद इस जोड़े (हां, मैं अपने भ्रामक पता के बाद से अपने सदस्य के लिए एक निजी एक है, लेकिन यह केवल एक प्रारंभ है):

string CPractice::name; 
1

नाम के बाद से एक स्थिर डेटा सदस्य है आप इसे प्रारंभ करना चाहिए :) और नहीं गिनती:

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