Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储指向成员函数的指针 我正在包装一个现有的C API,以便在我的VS2008 C++程序中使用起来更容易。C API需要一个包含函数指针的“TABLE_ENTRY”结构数组,如下面的代码所示_C++ - Fatal编程技术网

存储指向成员函数的指针 我正在包装一个现有的C API,以便在我的VS2008 C++程序中使用起来更容易。C API需要一个包含函数指针的“TABLE_ENTRY”结构数组,如下面的代码所示

存储指向成员函数的指针 我正在包装一个现有的C API,以便在我的VS2008 C++程序中使用起来更容易。C API需要一个包含函数指针的“TABLE_ENTRY”结构数组,如下面的代码所示,c++,C++,但是,我很难在函数指针中存储指向成员函数的指针。 有人能指出我可能做错了什么吗 谢谢, 保罗 我的代码基本上如下所示: struct TABLE_ENTRY; // forward decl typedef int (WINAPI *MYPROC )(DWORD msg, TABLE_ENTRY* entry); struct TABLE_ENTRY { const char* description; DWORD value; MYPROC callback; };

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

谢谢, 保罗

我的代码基本上如下所示:

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;
}
struct TABLE_ENTRY;//前进方向
typedef int(WINAPI*MYPROC)(DWORD msg,TABLE_ENTRY*ENTRY);
结构表\u项{
常量字符*描述;
德沃德值;
MYPROC回调;
};
类MyClass
{
公众:
MyClass():描述(“某些描述”),
某些_值(1)
{
};
int MyProc(DWORD msg,表条目*我的条目)
{
返回0;
};
表_条目*运算符*()
{
entry_u.description=description.c_str();
输入值=某个值;
//错误C2440:“=”:无法从“boost::\u bi::bind\u t”转换为“MYPROC”
entry.callback=boost::bind(&MyClass::MyProc,this);
返回和输入;
};
表u条目u;
std::字符串描述;
德沃德的一些价值观;
};
类MyClassCollection
{
公众:
表_ENTRY*GetTable()
{
//这是好的还是坏的&错的?
返回(&collection_.front())->运算符*();
};
无效添加(MyClass和my_类)
{
收集。推回(我的班级);
}
私人:
std::vector集合;
};
int _tmain(int argc,_TCHAR*argv[]
{
我的班级1;
我的班级2;
MyClassCollection;
集合。添加(类别1);
集合。添加(类别2);
TABLE_ENTRY*TABLE=collection.GetTable();
TABLE_ENTRY entry1=表[0];//应该是class1的表
TABLE_ENTRY entry2=表[1];//应该是class2的表
返回0;
}

boost::bind
创建一个functor,即实现
操作符()
的类的实例。这不能与普通的C函数指针互换。

boost::bind
创建一个函子,即实现
操作符()
的类的实例。这不能与普通C函数指针互换。

这:

typedef int (WINAPI *MYPROC )(DWORD msg, TABLE_ENTRY* entry);
…需要这样做:

typedef int (WINAPI MyClass::*MYPROC )(DWORD msg, TABLE_ENTRY* entry);
还有一大堆其他问题,但我想你问的是你的成员函数指针,所以我不需要对其余的问题发表评论。

这是:

typedef int (WINAPI *MYPROC )(DWORD msg, TABLE_ENTRY* entry);
…需要这样做:

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


还有一大堆其他问题,但我认为您所问的是您的成员函数指针,因此我不需要对其余的问题进行评论。

您希望使用类型
boost::function
,而不是
MYPROC
;顺便说一句,您使用运算符重载是邪恶的。@Johannes:然后将其交给C API?此外,将这些运算符粘贴到
std::vector
中是危险的,因为您将函数绑定到向量元素的
中。如果向量在添加元素的过程中需要重新分配,那么您以前获得或绑定的所有指针都将无效。@GMan-它是邪恶的,因为它晦涩难懂,还是邪恶的,因为它在某些情况下不起作用?你能说得更具体些吗?你想用类型
boost::function
,而不是
MYPROC
;顺便说一句,您使用运算符重载是邪恶的。@Johannes:然后将其交给C API?此外,将这些运算符粘贴到
std::vector
中是危险的,因为您将函数绑定到向量元素的
中。如果向量在添加元素的过程中需要重新分配,那么您以前获得或绑定的所有指针都将无效。@GMan-它是邪恶的,因为它晦涩难懂,还是邪恶的,因为它在某些情况下不起作用?你能说得更具体些吗?解决方案是不要使用
boost::bind
。您使用的是普通的函数指针,甚至不是成员函数指针(需要调用类的实例)。这对于静态类型语言来说是一件不幸的事情,尤其是C语言(API),在C语言中,我们甚至无法使用模板来至少获得更大的通用性(例如with
boost::bind
)。您必须创建一个静态函数,以某种方式将调用委托给“real”过程。然而,问题是如何绑定
指针。静态functon指针无法知道要在哪个对象上调用。我打赌该条目中的一些字段可以用于此目的,tho:)大多数C回调API都有一个闭包或私有数据的概念,可以返回到设备驱动程序中特定设备的结构。我想知道
description
字段的作用是什么……一个肮脏的黑客行为是
将回调
条目的地址重新解释为包含类的地址。免责声明:表项必须是类的第一个成员;类不能是多态的,甚至不能派生自任何东西;这在您的特定编译器上可能不起作用;不要在家里尝试,等等。@litb:事实上,在我最初的评论中有一个非常模糊的“不知怎么的”:P Nikolai是对的,大多数(如果不是所有的话)Win32回调提供了从中获取唯一数据的方法。这通常可以在
映射
(或者更好的是,
无序映射
)中找到相应的对象。然后将参数转发到实际函数中。解决方案是不要使用
boost::bind
。您使用的是普通的函数指针,甚至不是成员函数指针(需要调用类的实例)。这对于静态类型语言来说是一件不幸的事情,尤其是C语言(API),在C语言中,我们甚至无法使用模板来至少获得更大的通用性(例如with
boost::bind
)。您必须创建一个静态函数,以某种方式将调用委托给“实”过程