2011-03-21 5 views
88

क्या static कक्षा सदस्य कार्यों को करने के बजाय हेडर फ़ाइल में * .cpp फ़ाइल में कार्यान्वित करना संभव है?* .cpp फ़ाइल में स्थिर वर्ग सदस्य फ़ंक्शंस को कैसे कार्यान्वित करें?

क्या सभी static कार्य हमेशा inline हैं?

+4

आप समझा सकते हैं कि आपको "नहीं कर सकते" अपनी सीपीपी फ़ाइल में स्थिर वर्ग मेमबर फ़ंक्शन को कार्यान्वित करें? कोई त्रुटि? यह आमतौर पर इस तरह के कार्य को लागू करने के बारे में कोई सीमा नहीं है। – winterTTr

+3

@winterTTr, शायद प्रश्न उठ गया क्योंकि वेब पर अधिकांश उदाहरण/ट्यूटोरियल एक अलग कार्यान्वयन उदाहरण प्रस्तुत नहीं करते हैं, बल्कि इसे शीर्षलेख में घोषित और परिभाषित करते हैं। "सी ++ स्थिर सदस्य फ़ंक्शन" के लिए मेरे पसंदीदा खोज इंजन में कम से कम पहली छः हिट सभी इस तरह से करते हैं और यह नहीं बताते कि आप इसे नौसिखिए के लिए अलग-अलग फ़ाइलों में कैसे कार्यान्वित करते हैं। – crobar

+3

जब आप कार्यान्वित करते हैं, तो 'स्थिर' कीवर्ड दोहराएं नहीं। हेडर फ़ाइल – SomethingSomething

उत्तर

111

यह है।

test.hpp:

class A { 
public: 
    static int a(int i); 
}; 

test.cpp:

#include <iostream> 
#include "test.hpp" 


int A::a(int i) { 
    return i + 2; 
} 

using namespace std; 
int main() { 
    cout << A::a(4) << endl; 
} 

वे हमेशा नहीं इनलाइन हो नहीं है, लेकिन संकलक उन्हें बना सकते हैं।

41

इस प्रयास करें:

header.hxx:

class CFoo 
{ 
public: 
    static bool IsThisThingOn(); 
}; 

class.cxx:

#include "header.hxx" 
bool CFoo::IsThisThingOn() // note: no static keyword here 
{ 
    return true; 
} 
2

हां आप * .cpp फ़ाइल में स्थिर सदस्य फ़ंक्शंस को परिभाषित कर सकते हैं। यदि आप इसे हेडर में परिभाषित करते हैं, तो संकलक डिफ़ॉल्ट रूप से इनलाइन के रूप में व्यवहार करेगा। हालांकि, इसका मतलब यह नहीं है कि स्थाई सदस्य समारोह की अलग प्रतियां निष्पादन योग्य में मौजूद होंगी। इस बारे में अधिक जानने के लिए कृपया इस पोस्ट का पालन करें: Are static member functions in c++ copied in multiple translation units?

+0

यदि आप इसे कक्षा के शरीर में परिभाषित करते हैं, तो यह स्वचालित रूप से डिफ़ॉल्ट हो जाएगा। यदि यह कक्षा निकाय के बाहर हेडर में है, तो इसे बेहतर रूप से 'इनलाइन' या' टेम्पलेट 'चिह्नित किया गया है या आपको लिंकर से कई परिभाषा त्रुटियां मिलेंगी। –

7

helper.hxx

class helper 
{ 
public: 
    static void fn1() 
    { /* defined in header itself */ } 

    /* fn2 defined in src file helper.cxx */ 
    static void fn2(); 
}; 

helper.cxx

#include "helper.hxx" 
void helper::fn2() 
{ 
    /* fn2 defined in helper.cxx */ 
    /* do something */ 
} 

A.cxx

#include "helper.hxx" 
A::foo() { 
    helper::fn1(); 
    helper::fn2(); 
} 

के बारे में कैसे C++ संभालती स्थिर कार्यों की यात्रा में और अधिक जानने के लिए: "। इस जगह पर है कि फ़ाइल में सभी डेटा की प्रतिलिपि" Are static member functions in c++ copied in multiple translation units?

0

#include निर्देश का शाब्दिक अर्थ है इसलिए जब आप हेडर फ़ाइल को शामिल करते हैं, तो यह कोड फ़ाइल के भीतर टेक्स्ट रूप से होता है, और इसमें सब कुछ होगा, अन्य निर्देश या मैक्रो प्रतिस्थापन का प्रभाव दें, जब कोड फ़ाइल (अब संकलन इकाई या अनुवाद कहा जाता है यूनिट) प्रीप्रोसेसर मॉड्यूल से कंपाइलर मॉड्यूल में सौंप दिया गया है।

जिसका अर्थ है कि आपके स्थिर सदस्य फ़ंक्शन की घोषणा और परिभाषा वास्तव में एक ही फाइल में थी ...

1

@crobar, तो आप सही बहु फ़ाइल उदाहरण के एक कमी नहीं है कि कर रहे हैं, इसलिए मैं उम्मीद है कि यह मदद करता है में निम्नलिखित साझा करने के लिए फैसला किया है दूसरों:

:::::::::::::: 
main.cpp 
:::::::::::::: 

#include <iostream> 

#include "UseSomething.h" 
#include "Something.h" 

int main() 
{ 
    UseSomething y; 
    std::cout << y.getValue() << '\n'; 
} 

:::::::::::::: 
Something.h 
:::::::::::::: 

#ifndef SOMETHING_H_ 
#define SOMETHING_H_ 

class Something 
{ 
private: 
    static int s_value; 
public: 
    static int getValue() { return s_value; } // static member function 
}; 
#endif 

:::::::::::::: 
Something.cpp 
:::::::::::::: 

#include "Something.h" 

int Something::s_value = 1; // initializer 

:::::::::::::: 
UseSomething.h 
:::::::::::::: 

#ifndef USESOMETHING_H_ 
#define USESOMETHING_H_ 

class UseSomething 
{ 
public: 
    int getValue(); 
}; 

#endif 

:::::::::::::: 
UseSomething.cpp 
:::::::::::::: 

#include "UseSomething.h" 
#include "Something.h" 

int UseSomething::getValue() 
{ 
    return(Something::getValue()); 
} 
संबंधित मुद्दे