ale*_*son 4 c c++ dll pointers object
我正在寻找最常见和最健壮的方法来检查是否void*可以在给定的C++对象类型中进行转换.您可以在下面看到有关上下文的一些信息.
当我为DLL定义一个C API时,我经常使用void*来隐藏我后面使用的C++对象(如下所示)
typedef void* Instance_t;
int createInstance(Instance_t* pInst);
int processing(Instance_t inst, uint8_t* pBuf, size_t bufLength);
Run Code Online (Sandbox Code Playgroud)
当我createInstance的代码cast像这样的指针:
int createInstance(Instance_t* pInst)
{
MyClass* ptr = new MyClass();
*pInst = (void*)(ptr);
//.... etc
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但问题是我们后来如何定义我们定义的所有其他C函数,检查void*我们收到的值是否有效 MyClass*.我认为我们不能,因为C++转换操作符都不是真正的类型安全就是这种情况(偶数dynamic_cast).
现在我最好的解决方案是使用C cast(或a reinterpret_cast),如果一切正常,调用IsValid函数定义MyClass.
你有更好的方法来检查吗?
你不能这样做,除非你(比如说)从内存池中分配所有的MyClass实例,并检查你传递的地址是指向该内存池的指针.或者维护一个有效实例列表.
但是,如果你需要传递一个不透明的指针,只需让客户端使用
struct MyClass;
typedef struct MyClass *Instance_t;
Run Code Online (Sandbox Code Playgroud)
这将编译干净,让您安心合理.只要您只使用指针,编译器就会很高兴.它取消引用时,编译器需要知道指针实际指向的内容.
我认为你不能这样做,我认为你不应该这样做.A void *只是指向内存中某个位置的指针.几乎按照定义,没有办法知道它指向的是什么.
但是,为什么要对所有内容进行类型转换void *,为什么不在课堂上使用受保护和私有方法,如果你想阻止用户摆弄你班级的内部?