存储指向成员函数的指针

时间:2010-03-02 20:57:31

标签: c++

我正在包装一个现有的C API,以便在我的VS2008 C ++程序中更容易使用。 C API期望一个“TABLE_ENTRY”结构数组,其中包含一个函数指针,如下面的代码所示。

但是,我很难在函数指针中存储指向成员函数的指针。 有谁可以指出我可能做错了什么?

谢谢, PaulH

我的代码看起来基本上是这样的:

struct TABLE_ENTRY; // forward decl

typedef int (WINAPI *MYPROC )(DWORD msg, TABLE_ENTRY* entry);

struct TABLE_ENTRY {
    const char* description;
    DWORD value;
    MYPROC callback;
};

class MyClass
{
public:
    MyClass() : description( "Some Description" ),
                some_value( 1 )
    {
    };

    int MyProc( DWORD msg, TABLE_ENTRY* my_entry )
    {
        return 0;
    };

    TABLE_ENTRY* operator*()
    {
        entry_.description = description.c_str();
        entry_.value = some_value;
        // error C2440: '=' : cannot convert from 'boost::_bi::bind_t<R,F,L>' to 'MYPROC'
        entry_.callback = boost::bind< int >( &MyClass::MyProc, this );
        return &entry_;
    };

    TABLE_ENTRY entry_;
    std::string description;
    DWORD some_value;
};

class MyClassCollection
{
public:
    TABLE_ENTRY* GetTable()
    {
        // is this okay or is it Evil & wrong?
        return ( &collection_.front() )->operator*();
    };

    void Add( MyClass& my_class )
    {
        collection_.push_back( my_class );
    }
private:
    std::vector< MyClass > collection_;
};

int _tmain( int argc, _TCHAR* argv[] )
{
    MyClass class1;
    MyClass class2;

    MyClassCollection collection;
    collection.Add( class1 );
    collection.Add( class2 );

    TABLE_ENTRY* table = collection.GetTable();
    TABLE_ENTRY entry1 = table[ 0 ]; // should be class1's table
    TABLE_ENTRY entry2 = table[ 1 ]; // should be class2's table

    return 0;
}

2 个答案:

答案 0 :(得分:2)

boost::bind创建 仿函数 ,即实现operator()的类的实例。这与普通的C函数指针不可互换。

答案 1 :(得分:1)

此:

typedef int (WINAPI *MYPROC )(DWORD msg, TABLE_ENTRY* entry);

......需要这样:

typedef int (WINAPI MyClass::*MYPROC )(DWORD msg, TABLE_ENTRY* entry);

还有很多其他问题,但我认为你所问的是你的成员函数指针,所以我不需要评论其余部分。