2010-03-08 23 views
53

मैं एक वर्ग के सदस्य के रूप में फ़ंक्शन पॉइंटर सेट अप करना चाहता हूं जो एक ही कक्षा में किसी अन्य फ़ंक्शन के लिए पॉइंटर है। मैं ऐसा क्यों कर रहा हूं इसके कारण जटिल हैं।सदस्य फ़ंक्शन के लिए फ़ंक्शन पॉइंटर

इस उदाहरण में, मुझे पसंद है उत्पादन होने के लिए "1"

class A { 
public: 
int f(); 
int (*x)(); 
} 

int A::f() { 
return 1; 
} 


int main() { 
A a; 
a.x = a.f; 
printf("%d\n",a.x()) 
} 

हैं लेकिन इस संकलन में विफल रहता है। क्यूं कर?

उत्तर

89

वाक्यविन्यास गलत है। एक सदस्य सूचक एक साधारण सूचक से एक अलग प्रकार की श्रेणी है। सदस्य सूचक अपने वर्ग का एक उद्देश्य के साथ एक साथ इस्तेमाल किया जा करना होगा:

class A { 
public: 
int f(); 
int (A::*x)(); // <- declare by saying what class it is a pointer to 
}; 

int A::f() { 
return 1; 
} 


int main() { 
A a; 
a.x = &A::f; // use the :: syntax 
printf("%d\n",(a.*(a.x))()); // use together with an object of its class 
} 

a.x अभी तक क्या आपत्ति समारोह पर कहा जा रहा है पर कहना नहीं है। यह सिर्फ इतना कहता है कि आप ऑब्जेक्ट a में संग्रहीत पॉइंटर का उपयोग करना चाहते हैं। a तैयार करने के बाद .* ऑपरेटर के बाएं ऑपरेंड के रूप में एक और समय संकलक को बताएगा कि किस ऑब्जेक्ट पर फ़ंक्शन को कॉल करना है।

+0

मुझे पता है कि यह पुराना है, लेकिन मुझे '(ए। * ए.एक्स)()' के उपयोग को समझ में नहीं आता है। '(ए। * एक्स)()' क्यों काम नहीं करता है? –

+0

@gau क्योंकि एक्स दायरे में नहीं है –

+1

@gau मैंने इसे स्पष्ट करने के लिए अब माता-पिता को जोड़ा –

8

आपको किसी फ़ंक्शन में केवल पॉइंटर नहीं, किसी सदस्य फ़ंक्शन में पॉइंटर का उपयोग करने की आवश्यकता है।

class A { 
    int f() { return 1; } 
public: 
    int (A::*x)(); 

    A() : x(&A::f) {} 
}; 

int main() { 
    A a; 
    std::cout << (a.*a.x)(); 
    return 0; 
} 
15

int (*x)() सदस्य फ़ंक्शन के लिए सूचक नहीं है। सदस्य फ़ंक्शन के लिए एक पॉइंटर इस तरह लिखा गया है: int (A::*x)(void) = &A::f;

5

Call member function on string command

#include <iostream> 
#include <string> 


class A 
{ 
public: 
    void call(); 
private: 
    void printH(); 
    void command(std::string a, std::string b, void (A::*func)()); 
}; 

void A::printH() 
{ 
    std::cout<< "H\n"; 
} 

void A::call() 
{ 
    command("a","a", &A::printH); 
} 

void A::command(std::string a, std::string b, void (A::*func)()) 
{ 
    if(a == b) 
    { 
     (this->*func)(); 
    } 
} 

int main() 
{ 
    A a; 
    a.call(); 
    return 0; 
} 

वेतन (this->*func)(); की ओर ध्यान और जिस तरह से इस इस पृष्ठ पर कहीं और स्टर्लिंग उत्तरों के आधार पर है, वहीं वर्ग के नाम void (A::*func)()

0

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

#include <iostream> 
#include <vector> 
#include <stdio.h> 
#include <stdlib.h> 

class A{ 
public: 
    typedef vector<int> (A::*AFunc)(int I1,int I2); 
    vector<AFunc> FuncList; 
    inline int Subtract(int I1,int I2){return I1-I2;}; 
    inline int Add(int I1,int I2){return I1+I2;}; 
    ... 
    void Populate(); 
    void ExecuteAll(); 
}; 

void A::Populate(){ 
    FuncList.push_back(&A::Subtract); 
    FuncList.push_back(&A::Add); 
    ... 
} 

void A::ExecuteAll(){ 
    int In1=1,In2=2,Out=0; 
    for(size_t FuncId=0;FuncId<FuncList.size();FuncId++){ 
    Out=(this->*FuncList[FuncId])(In1,In2); 
    printf("Function %ld output %d\n",FuncId,Out); 
    } 
} 

int main(){ 
    A Demo; 
    Demo.Populate(); 
    Demo.ExecuteAll(); 
    return 0; 
} 

कुछ इस तरह उपयोगी है जब आप अनुक्रमित कार्यों की जरूरत है कि पैरामीटर वाक्य रचना और मदद सुझावों आदि संभवतः भी उपयोगी के साथ शादी करने के साथ एक कमांड दुभाषिया लिख ​​रहे हैं मेनू में

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