Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ 将typedef函数指向另一个类中的另一个函数_C++_Typedef - Fatal编程技术网

C++ 将typedef函数指向另一个类中的另一个函数

C++ 将typedef函数指向另一个类中的另一个函数,c++,typedef,C++,Typedef,我在A.h类上有这个typedef函数: typedef void(*PERCENTAGE_CALLBACK)(float); 我在类的函数中使用: int API_GenerateLayerData(int layerIndex, unsigned char *data, int dataSize, PERCENTAGE_CALLBACK callback); 在另一个类(ClassB.cpp)中,我有一个函数,该函数不返回任何内容(void),但接受一个浮点值,就像百分比回调一样: vo

我在A.h类上有这个typedef函数:

typedef void(*PERCENTAGE_CALLBACK)(float);
我在类的函数中使用:

int API_GenerateLayerData(int layerIndex, unsigned char *data, int dataSize, PERCENTAGE_CALLBACK callback);
在另一个类(ClassB.cpp)中,我有一个函数,该函数不返回任何内容(void),但接受一个浮点值,就像百分比回调一样:

void ClassB::Update(float progress)
{
    emit ChangeProgress((int)progress);
}
但是,当我初始化要使用并传递给ClassA中函数的PERCENTAGE_回调对象时,它抛出了一个错误:

public void someFunction()
{
    ClassA *a = new ClassA();

    PERCENTAGE_CALLBACK callback = &ClassB::Update; //Error: cannot convert void ti PERCENTAGE_CALLBACK

    a->API_GenerateLayerData(someNum, someData, count, callback);
}
如何初始化指向类B的更新函数的类A的回调


您不能这样做,因为调用成员函数还需要一个对象,应该在该对象上调用该成员

如果您的api只提供函数指针,而不依赖于它是哪个签名,那么即使不使用
std::bind
或lambda函数,也无法解决此问题。它们都是“可调用”对象,因此,它们还需要回调的对象指针或引用


如果您能够更改正在使用的API,则应将回调注册更改为
std::function
std::function
能够处理普通函数指针,以及lambda或对象/方法组合的任何其他组合。

您根本无法做到这一点,因为调用成员函数还需要一个对象,应该在该对象上调用成员

如果您的api只提供函数指针,而不依赖于它是哪个签名,那么即使不使用
std::bind
或lambda函数,也无法解决此问题。它们都是“可调用”对象,因此,它们还需要回调的对象指针或引用



如果您能够更改正在使用的API,则应将回调注册更改为
std::function
std::function
能够处理普通函数指针以及lambda或对象/方法组合的任何其他组合。

就像@Klaus已经说过的:您正在混合函数指针和指向成员函数的指针。这里是伟大的C++ FAQ,抱歉,我只是从C++迁移到C++ + xPultFrm,你不必为此感到抱歉:阅读关于成员指针的FAQ,它有例子你可以随意改变<代码> Apple PrimaTalayRead < /C> >的签名吗?我可以,但它只是一个使用相同参数的ExtDeldDll的包装器。acraig5075Like@Klaus已经说过:您正在混合函数指针和成员函数指针。这里是伟大的C++ FAQ,抱歉,我只是从C++迁移到C++ + xPultFrm,你不必为此感到抱歉:阅读关于成员指针的FAQ,它有例子你可以随意改变<代码> Apple PrimaTalayRead < /C> >的签名吗?我可以,但它只是一个使用相同参数的ExtDeldDll的包装器。acraig5075@TerribleDog字体请再读一遍我的答案!你不能!您已经更改了回调注册的接口,以同时接受成员函数指针和对象。这可以通过使用
std::function
作为参数来简化。当前接口无法处理成员回调。因此,无法将某些东西初始化为无法使用的值!它来自DLL,所以我有点困惑。也是因为我是在C++上开发的新手。我们正在从c#@TerribleDog迁移我们的项目:如果DLL定义的API不允许使用成员/对象,那么您就不能使用它们。听起来这是一个旧的C风格的API。如果是,则不能在此处使用对象。如果您只需要向成员函数注册单个对象,那么您可以使用调用对象成员的简单函数编写包装器。如果需要注册多个对象,则必须在包装器代码中编写自己的回调注册。但每当我在发送到DLL的函数中使用回调对象时,它就会抛出一个异常。如果我不能完全理解你的意思,我真的很抱歉。@TerribleDog:似乎是下一个问题。因此,请写另一个问题,并提出您的代码和错误消息。我们不应该在一个问题上讨论你所有的编码问题…@TerribleDog:请再读一遍我的答案!你不能!您已经更改了回调注册的接口,以同时接受成员函数指针和对象。这可以通过使用
std::function
作为参数来简化。当前接口无法处理成员回调。因此,无法将某些东西初始化为无法使用的值!它来自DLL,所以我有点困惑。也是因为我是在C++上开发的新手。我们正在从c#@TerribleDog迁移我们的项目:如果DLL定义的API不允许使用成员/对象,那么您就不能使用它们。听起来这是一个旧的C风格的API。如果是,则不能在此处使用对象。如果您只需要向成员函数注册单个对象,那么您可以使用调用对象成员的简单函数编写包装器。如果需要注册多个对象,则必须在包装器代码中编写自己的回调注册。但每当我在发送到DLL的函数中使用回调对象时,它就会抛出一个异常。如果我不能完全理解你的意思,我真的很抱歉。@TerribleDog:似乎是下一个问题。因此,请写另一个问题,并提出您的代码和错误消息。我们不应该在一个问题上讨论你所有的编码问题。。。