2011-10-20 13 views
6

कृपया पर विचार इन फ़ाइलों:सी ++ में स्थिर फ़ंक्शन पॉइंटर सदस्य के अनिर्धारित संदर्भ, मैं गलत क्या कर रहा हूं?

पीएच:

#ifndef _p_h_ 
#define _p_h_ 

class p{ 
public:  
    static void set_func(int(*)()); 

private: 
    static int (*sf)(); 

}; 
#endif 

p.cpp:

#include "p.h" 
#include <cstdio> 

int (p::*sf)() = NULL; //defining the function pointer 

void p::set_func(int(*f)()){ 
    sf = f; 
} 

main.cpp:

#include "p.h" 
#include <iostream> 

int function_x(){ 
     std::cout << "I'm function_x()" << std::endl; 
     return 1234; 
} 

int main(){ 
     p::set_func(function_x); 
} 

जब संकलन, मैं इस मिल:

$ g++ -o pp main.cpp p.cpp 
/tmp/ccIs0M7r.o:p.cpp:(.text+0x7): undefined reference to `p::sf' 
collect2: ld returned 1 exit status 

लेकिन:

$ g++ -c -o pp p.cpp 

सही संकलित करता है।

कोड के साथ क्या गलत है? मुझे यह नहीं पता कि समस्या कहां है, कृपया आपकी मदद की सराहना की जाएगी।

धन्यवाद।

+0

आप विचार कर सकते हैं [बूस्ट.फंक्शन] का उपयोग कर (http://www.boost.org/doc/libs/1_47_0/doc/html/function.html)। –

उत्तर

12

p::sf को परिभाषित करने पर आपका प्रयास गलत – है तुम्हारा एक वैश्विक sf नामित चर प्रकार int (p::*)() की है कि की एक परिभाषा है, यानी एक सदस्य कार्य करने के लिए एक सूचक है। नतीजतन p::sf अनिर्धारित रहता है, इसलिए लिंकर त्रुटि।

ऐसा करें: क्योंकि त्रुटि केवल तब होता है जब आप वास्तव में कार्यक्रम लिंक

int (*p::sf)() = 0; 

// or, 

typedef int (*p_sf_t)(); 
p_sf_t p::sf = 0; 
+0

वाह, उस स्पष्टीकरण के लिए बहुत बहुत धन्यवाद! अब मैं बेहतर समझता हूं कि "::" ऑपरेटर कैसे काम करता है। – Auxorro

4

अंतर है। समस्या स्थैतिक फ़ंक्शन पॉइंटर की आपकी घोषणा में है। सही वाक्यविन्यास है:

+0

बहुत बहुत धन्यवाद, यह – Auxorro

3

आप एक सदस्य फ़ंक्शन पॉइंटर को परिभाषित करते हैं, न कि फ़ंक्शन पॉइंटर। मुझे यकीन है कि क्या सही सिंटैक्स है नहीं कर रहा हूँ, लेकिन मैं कुछ इस तरह की कोशिश की है जाएगा:

int (*p::sf)() = NULL; 
+0

बहुत काम करता है, यह बहुत काम करता है – Auxorro

1

मैं एक जवाब नहीं देंगे (ildjarn जवाब सही है), लेकिन मैं आप एक ही प्राप्त करने का एक और तरीका सुझाव देगा स्थिर प्रारंभ (का बोझ भी इसका अर्थ है)

class p{ 
public: 
    typedef int (*func_t)(); 
    static void set_func(func_t v) { 
     func_t& f = getFuncRef(); 
     f = v; 
    } 

    static void call_func() { 
     func_t& f = getFuncRef(); 
     assert(f != 0); 
     f(); 
    } 

private: 

    static func_t& getFuncRef() { 
    static func_t sf = 0; 
    return sf; 
    } 

}; 

इस तरह से बिना आप एक स्थिर समारोह चर, जो प्रारंभ आदेश समस्याओं कि स्थिर डेटा चर को प्रभावित नहीं है करने के लिए स्थिर प्रारंभ प्रतिनिधि, और lazy- है प्रारंभिक

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