सी ++ में हेडर-फाइल में घोषणा के साथ स्रोत-फ़ाइल में स्थिर विधि को परिभाषित करें


142

मुझे C ++ में स्थिर विधियों के साथ काम करने में थोड़ी परेशानी हो रही है

उदाहरण।

class IC_Utility {
public:
    IC_Utility();
    ~IC_Utility();

    std::string CP_PStringToString( const unsigned char *outString );
    void CP_StringToPString( std::string& inString, unsigned char *outString, short inMaxLength );
    static void CP_StringToPString( std::string& inString, unsigned char *outString);
    void CP_StringToPString( FxString& inString, FxUChar *outString);

};

उदाहरण .cpp:

static void IC_Utility::CP_StringToPString(std::string& inString, unsigned char *outString)
{
    short       length = inString.length();

   if( outString != NULL )
    {
        if( length >= 1 )
            CPLAT::CP_Utility::CP_CopyMemory( inString.c_str(), &outString[ 1 ], length );

            outString[ 0 ] = length;
    }
}

मैं एक कॉल करना चाहता था जैसे:

IC_Utility::CP_StringToPString(directoryNameString, directoryName );

लेकिन मुझे एक त्रुटि मिली:

error: cannot declare member function 'static void IC_Utility::CP_StringToPString(std::string&, unsigned char*)' to have static linkage

मुझे समझ नहीं आता कि मैं ऐसा क्यों नहीं कर सकता। क्या कोई मुझे यह समझने में मदद कर सकता है कि मुझे क्यों और कैसे हासिल करना है?


2
सबसे पहले, आपको static.cpp फ़ाइल में कीवर्ड को निकालना चाहिए । C ++ इसकी अनुमति नहीं देता है।
फेज़वेज

10
@Fezvez: वैकल्पिक रूप से, इसके साथ बदलें /* static */। मुझे .h और .cpp फ़ाइलों में समान संशोधक और डिफ़ॉल्ट तर्क रखना पसंद है।
डेविड थॉर्नले

2
TL; DR: staticहेडर फाइल में रखें .h, इसका अर्थ है "क्लास से जुड़ा हुआ है, किसी वस्तु से नहीं", फाइल staticमें निकालें .cpp, इसका एक अलग अर्थ है जो आप यहाँ नहीं चाहते हैं।
स्टीफन गौरिचोन

जवाबों:


228

staticकीवर्ड को विधि परिभाषा में निकालें । इसे सिर्फ अपनी कक्षा की परिभाषा में रखें।

static.cpp फ़ाइल में रखा गया कीवर्ड का अर्थ है कि एक निश्चित फ़ंक्शन में एक स्थिर लिंकेज है, अर्थात। यह केवल उसी फ़ाइल में अन्य कार्यों से सुलभ है।


1
आह, समझे तो staticविधि की परिभाषा में उस वर्ग में केवल अन्य विधियाँ ही उस स्थैतिक विधि तक पहुँच सकती हैं, उस वर्ग के बाहर कोई अन्य विधि नहीं।
एबीवी

14
अन्य श्रेणी के तरीके नहीं, लेकिन .cpp फ़ाइल में अन्य कार्य। आपको वैसे भी C ++ में ऐसा नहीं करना चाहिए। यदि आप चाहते हैं कि C ++ फ़ंक्शन में आंतरिक लिंकेज हो, तो आपको इसे कुछ अनाम नामस्थान में रखने पर विचार करना चाहिए। static
.Cpp

1
बस जिज्ञासा के लिए ... यदि मैं एक स्थिर वर्ग के सदस्य को सीधे (.h फ़ाइल में) में परिभाषित करता हूं, तो मैं स्थैतिक लिंकेज का उपयोग कैसे कर सकता हूं?
लुम्ब्रिक

आप नहीं कर सकते। और ऐसा करने का कोई मतलब नहीं है, क्योंकि कार्यक्रम को एक साथ जोड़ने से अनसुलझे बाहरी दिखाई देंगे।
x13n

41

कीवर्ड staticऔर virtualपरिभाषा में दोहराया नहीं जाना चाहिए। उन्हें केवल कक्षा घोषणा में उपयोग किया जाना चाहिए।


11

आपको staticफ़ंक्शन परिभाषा में होने की आवश्यकता नहीं है


-3

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

static void CP_StringToPString( std::string& inString, unsigned char *outString);

चूंकि आपका सदस्य फ़ंक्शन CP_StringToPstringस्थिर है, इसलिए उस फ़ंक्शन में पैरामीटर हैं, inStringऔर outStringइसे स्थिर भी घोषित किया जाना चाहिए।

स्थिर सदस्य फ़ंक्शन उस ऑब्जेक्ट को संदर्भित नहीं करता है जिस पर वह काम कर रहा है, लेकिन आपके घोषित चर अपनी वर्तमान वस्तु को संदर्भित करते हैं इसलिए यह त्रुटि वापस करता है।

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


2
inString और outString स्टेटिक फ़ंक्शन के तर्क हैं। वे क्लास मेंबर नहीं हैं। उन्हें स्थैतिक में परिवर्तित करने की कोई आवश्यकता नहीं है।
999k

यह बिल्कुल सही नहीं है। आप स्थैतिक सदस्य फ़ंक्शन में गैर स्थिर तर्क रख सकते हैं। लेकिन कक्षा के सदस्यों के लिए, आप केवल फ़ंक्शन में स्थिर लोगों तक पहुंच / संशोधन कर सकते हैं।
ज़ाचरी क्रुस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.