2012-03-15 21 views
8

क्या सी ++ में मुख्य कक्षा के भीतर मौजूद किसी अन्य विधि से गैर स्थैतिक वर्ग सदस्य विधि को कॉल करने का कोई तरीका है? यदि हां, तो कोड कैसा दिखता है?किसी अन्य विधि से एक गैर स्टेटिक सदस्य विधि को कॉल करें

समस्या यह है कि, मैं इस specfic विधि को स्थिर के रूप में घोषित नहीं कर सकता, क्योंकि यह उसी वर्ग के भीतर अन्य विधियों का उपयोग करता है जो तब काम नहीं करते हैं यदि मैं एक स्थिर बना देता हूं।

मैं उपयोग करने के लिए कोशिश कर रहा हूँ:

MyClass::myClassMethod(); 
मुख्य वर्ग के भीतर एक विधि से

, लेकिन यह मुझे त्रुटि देता है: एक गैर स्थिर सदस्य संदर्भ एक विशिष्ट वस्तु के सापेक्ष होना चाहिए।

स्पष्ट करने के लिए, myClassMethod() की तरह MyClass के भीतर अन्य तरीकों का उपयोग करता:

void myClassMethod() { 
    ... 
    anotherClassMethod(); 
} 

इसलिए यदि मैं myClassMethod स्थिर बनाने के लिए थे यह anotherClassMethod बुला के साथ हस्तक्षेप होगा()।

+0

पहले से पोस्ट किए गए उत्तरों में प्रश्न और टिप्पणियां पढ़ने के बाद, यह अभी भी उपयोगी होगा कि आप जो भी करने की कोशिश कर रहे हैं उसके बारे में कुछ और जानकारी प्राप्त करें। क्या 'myClassMethod' स्थिर है? इसे कहां से बुलाया जा रहा है? क्या आप विधि में तर्क बदल सकते हैं? आपको जो समस्या सौंपी गई है उसका लक्ष्य क्या है? – tmpearce

+0

ऐसा लगता है कि आपको वास्तव में इस बारे में सोचना होगा कि आप यहां क्या व्यवहार कर सकते हैं। स्थैतिक और नो-स्टेटिक विधियों के साथ महत्वपूर्ण अंतर यह है कि उत्तरार्द्ध को कक्षा डेटा तक पहुंचने की आवश्यकता है, या शायद वर्चुअल कॉल करें जो आंतरिक रूप से वही करते हैं। यदि 'myClassMethod' 'elseClassMethod' को कॉल करता है जो गैर स्थैतिक है, तो क्या ऐसा करने की आवश्यकता है? यदि नहीं, तो उन्हें स्थिर बनाओ। यदि ऐसा है, तो जब आप डेटा तक पहुंचने का प्रयास करते हैं तो आप क्या होने की उम्मीद करते हैं? – Keith

उत्तर

3

static सदस्य फ़ंक्शन से गैर स्थैतिक सदस्य फ़ंक्शन को कॉल करने का सौदा क्या है?

प्रत्येक गैर स्थिर सदस्य समारोह मापदंडों आप पारित करने के लिए इसके अलावा में परोक्ष एक this सूचक पारित हो जाता है, सूचक पारित कर दिया तो वर्ग वस्तु सदस्यों हालांकि static कार्यों निहित this सूचक के साथ पारित नहीं कर रहे हैं उल्लेख करने के लिए dereferenced है और इसलिए एक नहीं कर सकते एक स्थिर सदस्य फ़ंक्शन के अंदर किसी भी गैर स्थिर सदस्य फ़ंक्शन को कॉल करें क्योंकि ऐसा करने के लिए this नहीं है।

समाधान क्या है, यदि आप इसे वैसे भी करना चाहते हैं?

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

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


दूसरा विचार पर शायद मैं गलत पढ़ा से पहले अपने प्रश्न, शायद, आपका सवाल यह है:

कैसे main से एक वर्ग के एक गैर स्थिर सदस्य समारोह कॉल करने के लिए?

आपको गैर-स्थिर सदस्य कार्यों को कॉल करने के लिए कक्षा का एक उदाहरण चाहिए।
तो बस,

MyClass obj; 
obj.myClassMethod(); 

और myClassMethod() के भीतर से किसी अन्य सदस्य फ़ंक्शन को कॉल बस होगा:

void myClassMethod() 
{ 
    //... 
    anyOtherMyClassNonStaticMemberFunction(); 
    //... 
} 
+0

क्षमा करें, मैं एक नौसिखिया हूँ। यह मैं कैसे करूंगा? – aclark

+0

@aclark: कृपया अद्यतन उत्तर की जांच करें, मैंने कुछ और विवरण जोड़ा। क्या यह समझ में आता है? स्पष्टीकरण के लिए –

+0

धन्यवाद। समस्या यह है कि डिजाइन प्रशिक्षक द्वारा दिया जाता है, इसलिए मुझे इसके साथ काम करना है। मुझे भी बहुत दृढ़ लगता है: -/ – aclark

3

एक ही तरीका है एक वर्ग के एक गैर स्थिर विधि कॉल करने कि का एक उदाहरण के माध्यम से है कक्षा। तो आपको इस तरह कुछ चाहिए ...

MyClass myClass; 
myClass.myClassMethod(); 
+0

यह बहुत अच्छा है। धन्यवाद। – aclark

4

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

यदि आप anotherClassMethod() गैर स्थैतिक है, तो इसका मतलब है कि इसे किसी विशिष्ट वस्तु, कक्षा का एक उदाहरण पर बुलाया जाना है। क्योंकि इसे किसी ऑब्जेक्ट पर कहा जाता है, यह उस ऑब्जेक्ट में संग्रहीत डेटा तक पहुंच सकता है (गैर स्थैतिक सदस्य चर)। यदि myClassMethod() स्थिर है और आप के रूप में

void MyClass::myClassMethod() { 
    anotherClassMethod(); 
} 

इसे लागू ऐसा इसलिए है क्योंकि anotherClassMethod() एक विशिष्ट वस्तु पर कहा जा करने की उम्मीद है काम नहीं करेगा, लेकिन myClassMethod() एक भी नहीं है। लेकिन अगर आप जानते हैं कि आप उस पर कॉल करना चाहते हैं वस्तु, आप इसे एक साधारण विधि कॉल के रूप में एक वस्तु पर कर सकते हैं:

void MyClass::myClassMethod(MyClass &object) { 
    object.anotherClassMethod(); 
} 

object एक तर्क के रूप में पारित होने की जरूरत नहीं है; यह कक्षा में एक स्थिर सदस्य चर, उदाहरण के लिए हो सकता है:

class MyClass { 
private: 
    static MyClass theInstance; 

    // ... 
}; 

void MyClass::myClassMethod() { 
    theInstance.anotherClassMethod(); 
} 

अंत में, सवाल तुम अपने आप को पूछने की आवश्यकता है: क्यों myClassMethod() स्थिर है, और क्यों anotherClassMethod() गैर स्थिर है? एक कदम पीछे जाएं, इस बारे में सोचें कि myClassMethod() क्या करना है। क्या आपके पास कॉल करने का कोई अर्थ नहीं है जब आपके पास काम करने का कोई उदाहरण नहीं है? यदि हां, तो उसे एक विधि को कॉल करने की आवश्यकता क्यों है जो किसी उदाहरण के साथ काम करने की अपेक्षा करता है?

0

मुझे लगता है कि शायद आप सिंगलटन पैटर्न का उपयोग कर सकते हैं, वैश्विक स्तर पर कक्षा का उदाहरण रखें। एक उपयोगिता वर्ग की तरह।

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