2012-11-11 42 views
8

में मैं की तरह एक वर्ग :: हैस्टेटिक समारोह कॉल गैर स्थिर समारोह सी ++

Class Test 
{ 
    public: 
    void Check(){//dosomething}; 
    static void call(){//I want to call check()}; 
}; 

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

+0

यह स्पष्ट नहीं है कि आप क्या करने का प्रयास कर रहे हैं।आप भाषा के साथ इसके चारों ओर हैक करने के लिए लाखों तरीकों से आ सकते हैं, लेकिन आखिरकार आप इस स्थिति में कारण यह है कि आपकी आवश्यकता का कोई मतलब नहीं है। 'कॉल' के भीतर कोई ऑब्जेक्ट संदर्भ नहीं है। आपको ऐसा क्यों लगता है कि आपको ऐसा करने की ज़रूरत है? –

+0

क्यों एक स्थिर कार्य 'चेक' घोषित नहीं करें? –

+1

किसी भी गैर स्थैतिक फ़ंक्शन को कॉल करने के लिए आपको 'कक्षा परीक्षण' का एक उदाहरण चाहिए (यानी 'यह' सूचक)। – mark

उत्तर

9

जब से तुम एक उदाहरण की जरूरत है, आप या तो है, बनाने के लिए एक स्थिर उदाहरण का उपयोग करें, या call() को यह पहले कभी किया है:

Class Test 
{ 
    private: 
    static Test instance; 

    public: 
    void Check(){//dosomething}; 
    // use one of the following: 
    static void call(Test& t){ t.check(); }; 
    static void call(){ Test t; t.check(); }; 
    static void call(){ instance.check(); }; 
}; 
+1

इंस्टेंस वैरिएबल कैसे सेट करें? – JavaRunner

3

ऐसा लगता है जैसे कुछ खराब डिज़ाइन चल रहा है।

किसी भी तरह, आप क्या कर सकते हैं, कॉल में टेस्ट का एक उदाहरण बनाते हैं, और उस उदाहरण पर कॉल करें। कॉल के कार्यान्वयन तो कुछ इस तरह होगा:

void call(){ 
    Test test; 
    test.Check(); 
} 

हालांकि, ध्यान दें कि यदि चेक टेस्ट के सदस्यों के साथ कुछ करता है, यह बिल्कुल ही बनाई टेस्ट वस्तु पर लागू होंगे। मैं पुनर्विचार करूँगा कि क्या आप वास्तव में स्थिर होना चाहते हैं, या नहीं होने की जांच करें।

0

इस के लिए कोई आसान जवाब नहीं है। ऐसी कई चीजें हैं जो आप कर सकते हैं, लेकिन जो सही है, उस पर निर्भर करता है कि आपके कोड का क्या अर्थ है। यह डिज़ाइन प्रश्न है, प्रोग्रामिंग प्रश्न नहीं।

आप पहले से ही विभिन्न प्रोग्रामिंग चालें तुम कर सकते हो सुझाव दिया है, एक Test सूचक बनाने की तरह (वास्तव में आप एक Test सूचक है, बस एक Test वस्तु की जरूरत नहीं है)। मैं अधिक चाल का सुझाव दे सकता हूं, उदाहरण के लिए आप call() को फिर से लिख सकते हैं ताकि यह स्थैतिक न हो, या (लगभग एक ही चीज़) आप Test पॉइंटर call() के पैरामीटर के रूप में पास कर सकते हैं और इसका उपयोग कर सकते हैं, या आप वैश्विक Test ऑब्जेक्ट बना सकते हैं और उसका उपयोग करें। इनमें से कोई भी समस्या के दिल में नहीं आता है। अपने प्रश्न का उत्तर देने के लिए आपको अपने आप से सवाल पूछना होगा, मैंने पहले स्थान पर call() स्थैतिक क्यों बनाया, एक स्थैतिक फ़ंक्शन को गैर स्थैतिक फ़ंक्शन को कॉल करने की आवश्यकता क्यों होती है।

यदि आप इसे समझा सकते हैं, तो अधिक विशिष्ट सलाह देना आसान है।

0

गैर स्थैतिक और स्थिर सदस्य फ़ंक्शन के बीच की कुंजी यह है कि बाद में कोई ऑब्जेक्ट नहीं है। हालांकि, अभी भी अन्य सभी सदस्यों की तरह ही पहुंच विशेषाधिकार हैं।

जब आप एक स्थिर सदस्य से एक गैर स्थैतिक सदस्य फ़ंक्शन को कॉल करना चाहते हैं, तो आपको अभी भी किसी ऑब्जेक्ट के साथ आने की आवश्यकता है। अक्सर, किसी ऑब्जेक्ट को प्राप्त करने के लिए स्थिर सदस्य फ़ंक्शन कुछ संदर्भ में पारित हो जाता है। आपके प्रश्न की आवाज़ से ऐसा लगता है कि स्थैतिक और गैर स्थैतिक कार्य समान चीजों को करने के लिए हैं जिनकी आवश्यकता नहीं है और वस्तु नहीं है। इस मामले में यह शायद आम हिस्सा कारक, किसी भी वस्तु पर निर्भर करता है न कि किसी अन्य समारोह जो तब call() और Check() दोनों से कहा जाता है में, सबसे अच्छा है:

void Test::call() { 
    common(); 
    // ... other code 
} 
void Test::Check() { 
    common(); 
    // ... other code, possibly depending on "this" 
} 
void Test::common() { 
    // logic shared by both call() and Check() but not depending on "this" 
} 

आम कोड एक वस्तु की जरूरत है, वहाँ कोई है आपके स्थिर सदस्य फ़ंक्शन में ऑब्जेक्ट के साथ आने से अन्य तरीका।

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