2011年6月20日 星期一

[問題]成員函數的指標傳入全域函數

有一個我想得到的值
這個值從一個全域函數產生
我只能傳函數指標進全域函數,才能得到這個值

當我想要要物件化時,我遇到了麻煩

======================================================
//GlobalFunc( bool(*)(int*) ); //這是別人寫好的,我不能改變
/**A.hpp*/
class A
{
    friend GlobalFunc( bool(*)(int*) );
    public:
        A();
        bool foo( int* someingYouWant )
        {
            a = someingYouWant;
            return ( a == NULL );
        }
        int * a;
}

======================================================
/**A.cpp*/
A::A()
{
    a = NULL;
    GlobalFunc( &foo );
    //GlobalFunc( *foo );
    //GlobalFunc( foo );
}
======================================================
error:
ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.



苦思許久,想到了下面這個方法

======================================================
//GlobalFunc( bool(*)(int*) ); //這是別人寫好的,我不能改變
/**A.hpp*/
class A
{
    public:
        A();
        int * a;
}
======================================================
/**A.cpp*/
namespace
{
    int * a_ = NULL;
    bool foo( int* someingYouWant )
    {
        a_ = someingYouWant;
        return ( a_ == NULL );
    }
}
A::A()
{
    a = NULL;
    GlobalFunc( &foo );
    //GlobalFunc( *foo );
    //GlobalFunc( foo );
    a = a_;
}
======================================================

但這方法讓我感覺不像物件導向

是否有其他方法解決這個問題?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我又想到了一種變形

======================================================
//GlobalFunc( bool(*)(int*) ); //這是別人寫好的,我不能改變
/**A.hpp*/
class A
{
    public:
        A();
        int * a;
        static bool foo( int* someingYouWant )
        {
            a_ = someingYouWant;
            return ( a_ == NULL );
        }
    private:
        static int * a_;
}
======================================================
/**A.cpp*/
A::A()
{
    a = NULL;
    GlobalFunc( &foo );
    //GlobalFunc( *foo );
    //GlobalFunc( foo );
    a = a_;
}
======================================================

這樣比較像物件導向:D

有沒有更好的方法呢?

沒有留言:

張貼留言