我正在编写应该初始化一些数据并返回void指针的库。然后在C代码中使用指针。 在库内部我想使用C ++类来初始化这些数据。
void *init()
{
return new MyData();
}
void fini(void *d)
{
MyData *m = reinterpret_cast<MyData *>(d);
delete d;
}
这是有效的,而MyData是没有虚方法的简单类。但现在我希望MyData成为抽象类的实现。
class Base // No virtual things
{
int val;
};
class A : public Base // Abstract class
{
virtual int x() = 0;
};
class B : public A // Implementation
{
int x() {return val;}
};
如果我然后将此类转换为void *,则前4个字节的数据将不会反映&#34; val&#34;基类的变量。因为vtable可能吗?好吧,我明白这是错误的投射方式。有什么建议?像
这样的东西return static_cast<Base *>(new MyData);
似乎工作但我还需要从void *重建MyData并正确删除它。 C程序只使用MyData的Base部分中的值。
这是替代
void *init()
{
return new MyData();
}
void fini(void *d)
{
delete reinterpret_cast<MyData *>(d);
}
void *getbase(void *d)
{
MyData *m = reinterpret_cast<MyData *>(d);
return static_cast<Base *>(m);
}
但我想避免第三个功能。谢谢,抱歉我的英语。
答案 0 :(得分:1)
std::string_view sv("hello folks")
参与所有测试。感谢geza。