* .Cpp फ़ाइल में स्थिर वर्ग सदस्य कार्यों को कैसे लागू करें?


125

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

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


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

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

7
जब आप लागू करते हैं, तो staticकीवर्ड को दोहराएं नहीं । staticहेडर फाइल में केवल क्लास डेफिनिशन में ही कीवर्ड लिखें
SomeSomething

@ क्रोबार, आप सही कह रहे हैं कि मल्टी-फाइल उदाहरणों की कमी है। मैंने इसका पता लगाने के लिए संघर्ष किया, इसलिए मैंने निम्नलिखित साझा करने का फैसला किया:
डॉन म्लेकाचलान

जवाबों:


153

यह है।

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;
}

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


47

इसे इस्तेमाल करे:

header.hxx:

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

class.cxx:

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

9

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 ++ स्थैतिक कार्यों को कैसे संभालता है: क्या c ++ में स्थिर सदस्य कार्य कई अनुवाद इकाइयों में कॉपी किए गए हैं?


2

हाँ आप * .cpp फ़ाइल में स्थिर सदस्य कार्यों को परिभाषित कर सकते हैं। यदि आप इसे हेडर में परिभाषित करते हैं, तो संकलक डिफ़ॉल्ट रूप से इसे इनलाइन के रूप में मानेगा। हालांकि, इसका मतलब यह नहीं है कि स्थिर सदस्य फ़ंक्शन की अलग-अलग प्रतियां निष्पादन योग्य में मौजूद होंगी। कृपया इस बारे में अधिक जानने के लिए इस पोस्ट का अनुसरण करें: क्या कई अनुवाद इकाइयों में कॉपी किए गए c ++ में स्थिर सदस्य फ़ंक्शन हैं?


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

2

अपने शीर्षक फ़ाइल में foo.h कहते हैं

class Foo{
    public:
        static void someFunction(params..);
    // other stuff
}

अपनी कार्यान्वयन फ़ाइल में foo.cpp कहें

#include "foo.h"

void Foo::someFunction(params..){
    // Implementation of someFunction
}

बहोत महत्वपूर्ण

जब आप स्थैतिक फ़ंक्शन को अपनी कार्यान्वयन फ़ाइल में लागू कर रहे हों, तो सुनिश्चित करें कि आप अपने विधि हस्ताक्षर में स्थैतिक कीवर्ड का उपयोग नहीं करते हैं।

शुभ लाभ


1

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

::::::::::::::
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());
}


0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.