2011-10-20 17 views
6

これらのファイルをご検討ください。C++の静的関数ポインタメンバーへの未定義の参照は何ですか?

のpH:

#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 

は右コンパイルします。

コードに問題がありますか?私は問題がどこにあるのか分かりません。あなたの助けが高く評価されますように。

ありがとうございました。 p::sfを定義するに

+0

[Boost.Function](http://www.boost.org/doc/libs/1_47_0/doc/html/function.html)を使用してください。 –

答えて

12

あなたの試みは間違って–あなた次第ですタイプint (p::*)()、メンバ関数へのポインタ、すなわちであるsfという名前のグローバル変数の定義です。その結果、p::sfは未定義のままであり、したがってリンカのエラーです。

が、この代わりに試してみてください:あなたは、実際にプログラムをリンクするときにエラーが発生しただけであるため

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

// or, 

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

うわー、ありがとう、その説明のために!今私は "::"演算子がどのように働くかをよく理解しています。 – Auxorro

4

差があります。問題は静的関数ポインタの宣言にあります。正しい構文は次のとおりです。

int (*p::sf)() = NULL; //defining the function pointer 
+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-です初期化済み

関連する問題