2016-10-28 7 views
2

私はクラスメソッドをグローバル関数に向けようとしていますが、私はthis
を見たことがありますが、どうしたらいいでしょうか?クラス非静的メソッドグローバル関数へのポインタ

class x 
{ 
    public: 
     int(x::*GetVal)(int); 
}; 

int RtX(int a) 
{ 
    return a * 4; 
} 

// declaration 
int(x::*GetVal)(int) = (int(x::*)(int))&::Rtx; // :: global? // error 

int main() 
{ 
    x a; 
    cout << (a.*GetVal)(4) << endl; 
} 

これは私にエラーを返します:

[Error] invalid cast from type 'int ()(int)' to type 'int (x::)(int)'

+7

使用[ 'のstd :: function'](のhttp:// en.cppreference.com/w/cpp/utility/functional/function)と['std :: bind'](http://en.cppreference.com/w/cpp/utility/functional/bind)を参照してください。 –

+1

あなたのエラーに関しては、メンバ関数は非メンバ関数と同じではありません。メンバ関数は呼び出されるオブジェクトのインスタンスを必要とし、非メンバ関数は呼び出されません。そのオブジェクトインスタンスは、しばしば隠し引数としてメンバ関数に渡され、非メンバ関数はその隠された引数を持たないため、単に形や形式に互換性がありません。 –

+2

をバインドする代わりに、メンバー関数を呼び出して 'std :: function'オブジェクトに格納するlambaを使用することもできます。 – Hayt

答えて

1

x::GetXは、メンバへのポインタである

が、この考えてみましょう。これらは非常に複雑な獣で、非メンバー機能を指すようにすることはできません。あなたはほぼ確実にそれは間違ってやっている、それしばらく -

#include <iostream> 

int RtX(int a) // Global non-member function 
{ 
    return a * 4; 
} 

class x 
{ 
    public: 

     int(x::*GetVal)(int); 

     // This is an instance member function which acts as a proxy and calls the 
     // the global function 
     int RtX(int a) { return ::RtX(a); } 
}; 


int main() 
{ 
    x a; 
    a.GetVal =&x.RtX; // Assign the member variable. Could do this in the 
         // constructor. **NOTE** No casts! 
    std::cout << (a.*GetVal)(4) << std::endl; 
} 

あなたが関数ポインタとポインタ・ツー・メンバー関数を扱うときに自分がキャストに手を伸ばす見つけた場合は、停止を次のコードは動作しますコンパイルすると、正しく実行されない可能性が非常に高いです。

また、コメントに記載されているように、std::functionを使用してください。

#include <iostream> 
#include <functional> 

int RtX(int a) 
{ 
    return a * 4; 
} 

class x 
{ 
public: 
    std::function<int(int)> GetVal; 

    // Initialize GetVal in the constructor. 
    x() : GetVal(RtX) 
    {} 

    // Alternatively, you can initialize the variable in with a default 
    // initialization. You can also declare the member const if you don't want to 
    // change it later. 

    const std::function<int(int)> gv = RtX; 

    /* 
}; 

int main() 
{ 
    x a; 
    std::cout << a.GetVal(4) << std::endl; 
} 
+0

良い点。タイトルに「静的でない」ことに気付かなかった。私は改正するつもりです。 –

+0

私は静的である可能性があることを知っていましたが、可能であれば静的でないことを知りたかったのです。ありがとうございました。 – nikomaster

+1

あなたが持っていたものは静的ではありませんでした。私は非静的に更新しました。 –

1

非静的メンバー関数は、呼び出すためにインスタンスを必要とします。あなたは代わりに静的関数メンバを使用して検討するかもしれないし、あなたもstd::functionを使用する場合は、インスタンスせずにメンバ関数を割り当てるための簡単なコードを取得する可能性があります:

#include <iostream> 
#include <functional> 

int RtX(int a) 
{ 
    return a * 4; 
} 

class x 
{ 
public: 
    static std::function<int(int)> GetVal; 
}; 

std::function<int(int)> x::GetVal = RtX; 

int main() 
{ 
    x a; 
    std::cout << (a.GetVal)(4) << std::endl; 
} 
関連する問題