Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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库对C++成员函数的回调,想要实现如下: SomeObject* findSomeObjectByHandlePointer(datahandle *dh) { }.._C++_C_Callback - Fatal编程技术网

映射,按指针(指向某个对象的相关结构)存储指针(指向对象)。使用哪种类型? 为了克服C库对C++成员函数的回调,想要实现如下: SomeObject* findSomeObjectByHandlePointer(datahandle *dh) { }..

映射,按指针(指向某个对象的相关结构)存储指针(指向对象)。使用哪种类型? 为了克服C库对C++成员函数的回调,想要实现如下: SomeObject* findSomeObjectByHandlePointer(datahandle *dh) { }..,c++,c,callback,C++,C,Callback,通过使用一个映射,其中包含*datahandle的地址作为索引,以及*SomeObject的地址作为值 创建SomeObject时,它会生成一组数据句柄,这些数据句柄对于对象是唯一的。然后,它将指向*datahandle的指针和静态回调函数传递给C库,然后C库回调并返回指向datahandle的指针,而datahandle又可以与SomeObject相关联 除了安全但缓慢的,您还可以推荐哪些类型的指针值存储在映射中 告诉我也不要使用auto\u ptr。我想这就足够了。这就是我们所使用的: c

通过使用一个映射,其中包含*datahandle的地址作为索引,以及*SomeObject的地址作为值

创建SomeObject时,它会生成一组数据句柄,这些数据句柄对于对象是唯一的。然后,它将指向*datahandle的指针和静态回调函数传递给C库,然后C库回调并返回指向datahandle的指针,而datahandle又可以与SomeObject相关联

除了安全但缓慢的
,您还可以推荐哪些类型的指针值存储在映射中



告诉我也不要使用
auto\u ptr

我想这就足够了。这就是我们所使用的:

class datahandle;
class SomeObject;

typedef std::map<datahandle*, SomeObject*> pointer_map;

pointer_map my_map;

SomeObject* findSomeObjectByHandlePointer( datahandle *dh) {
    pointer_map::const_iterator ff = my_map.find(dh);
    if (ff != my_map.end()) {
        return ii->second;
    }
    return NULL;
}
类数据句柄;
类对象;
typedef std::映射指针\u映射;
指针映射我的映射;
SomeObject*findSomeObjectByHandlePointer(datahandle*dh){
指针映射::常量迭代器ff=my\u map.find(dh);
if(ff!=my_map.end()){
返回二->秒;
}
返回NULL;
}

我想这就足够了。这就是我们所使用的:

class datahandle;
class SomeObject;

typedef std::map<datahandle*, SomeObject*> pointer_map;

pointer_map my_map;

SomeObject* findSomeObjectByHandlePointer( datahandle *dh) {
    pointer_map::const_iterator ff = my_map.find(dh);
    if (ff != my_map.end()) {
        return ii->second;
    }
    return NULL;
}
类数据句柄;
类对象;
typedef std::映射指针\u映射;
指针映射我的映射;
SomeObject*findSomeObjectByHandlePointer(datahandle*dh){
指针映射::常量迭代器ff=my\u map.find(dh);
if(ff!=my_map.end()){
返回二->秒;
}
返回NULL;
}

通常,类似C的回调采用
void*user\u data
参数,允许您传入任何需要的内容:

void c_func(void (*fptr)(void*), void* user_data){
  // do some stuff
  fptr(user_data);
}
现在,只需创建以下静态成员函数:

class A{
public:
  static void c_callback(void* my_data){
    A* my_this = static_cast<A*>(my_data);
    // do stuff with my_this
  }
};
或者,如果该
实例需要超出当前范围,则需要以某种方式将堆分配的指针保存在某个位置,然后手动删除它。不幸的是,一个
共享的\u ptr
或类似的东西在这里不起作用(



关于在映射中存储指针的问题,这根本不是问题,请看一点。

通常,类似C的回调采用
void*user\u data
参数,允许您传入任何需要的内容:

void c_func(void (*fptr)(void*), void* user_data){
  // do some stuff
  fptr(user_data);
}
现在,只需创建以下静态成员函数:

class A{
public:
  static void c_callback(void* my_data){
    A* my_this = static_cast<A*>(my_data);
    // do stuff with my_this
  }
};
或者,如果某个
实例需要超出当前作用域,则需要以某种方式将堆分配的指针保存在某个位置,然后手动将其删除。
共享\u ptr
或类似的东西在这里不起作用,很遗憾:(



关于在映射中存储指针的问题,这根本不是问题,请看一点。

回调函数通常有一个类型为
void*
的额外参数,您可以使用该参数传递可能需要的任何附加数据。因此,如果您想使用成员函数作为回调函数,可以传递一个指向转换为的对象的指针de>void*
,然后将其强制转换并调用回调函数中的成员函数。

通常回调函数有一个类型为
void*
的额外参数,可用于传递可能需要的任何附加数据。因此,如果要将成员函数用作回调函数,请传入一个指向强制转换为的对象的指针e> 作废*
,然后将其强制转换并调用回调函数中的成员函数。

如果读取次数多,写入次数少,则可以将向量作为一个集合使用。这非常常见,因为
下限
映射
更有效,并且占用的内存空间更少:

typedef std::pair<std::string,Your_pointer> your_type;
bool your_less_function( const your_type &a, const your_type &b )
{
  // your less function
  return ( a < b );
}
...
std::vector<your_type> ordered-vector;
询问数据时:

std::vector<your_type>::iterator iter = std::lower_bound( ordered-vector.begin(), ordered-vector.end(), value, your_less_function );
if ( ( iter == ordered-vector.end() ) || your_less_function( *iter, value ) )
  // you did not find the value
else
  // iter contains the value
std::vector::iterator iter=std::lower_bound(ordered vector.begin(),ordered vector.end(),value,您的_less_函数);
if((iter==ordered vector.end())| |你的_less_函数(*iter,value))
//您没有找到值
其他的
//iter包含了这个值

如果读取次数多,写入次数少,则可以将向量作为一个集合使用。这是非常常见的,因为
下限
映射
更有效,并且占用的内存空间更少:

typedef std::pair<std::string,Your_pointer> your_type;
bool your_less_function( const your_type &a, const your_type &b )
{
  // your less function
  return ( a < b );
}
...
std::vector<your_type> ordered-vector;
询问数据时:

std::vector<your_type>::iterator iter = std::lower_bound( ordered-vector.begin(), ordered-vector.end(), value, your_less_function );
if ( ( iter == ordered-vector.end() ) || your_less_function( *iter, value ) )
  // you did not find the value
else
  // iter contains the value
std::vector::iterator iter=std::lower_bound(ordered vector.begin(),ordered vector.end(),value,您的_less_函数);
if((iter==ordered vector.end())| |你的_less_函数(*iter,value))
//您没有找到值
其他的
//iter包含了这个值

也许我遗漏了什么,但是为什么回调函数不能接收到指向对象本身的指针(转换为
void*
),避免了任何类型的查找?字符串是如何涉及的?我想你错过了那篇文章的第一句话。不要…。如果你必须支持遗留代码,那么你可以创建一个全局或单例对象,并在顶层将方法导出为非成员函数。@AJG85,目前,某些方法可用作non成员函数。它无法区分哪个实例(对象之一)因此,我需要识别回调->数据和C++对象->数据对,调用正确的对象的实际回调函数。@ Oli Charlesworth,不确定如果将指针存储为map index不会导致复制它们。需要索引的具体类型,查找和比较。可能我缺少了一些东西,但是为什么?回调函数不能接收指向对象本身的指针(转换为
void*
),避免了任何类型的查找?字符串是如何涉及的?我想你错过了那篇文章的第一句话。不要…。如果你必须支持遗留代码,那么你可以创建一个全局或单例对象,并在顶层将方法导出为非成员函数。@AJG85,目前,某些方法可用作non成员函数。它无法区分哪个实例(对象之一)因此,我需要识别回调->数据和C++对象->数据对,调用正确的对象的实际回调函数。@ Oli Charlesworth,不确定如果将指针存储为MAP索引不会导致复制它们……需要一些具体的索引类型