将c ++对象转换为void *的安全/标准方法

时间:2015-02-03 12:00:12

标签: c++ pointers

是否有一种安全/标准的方法可以在c ++中将对象分配给void *,然后将其转换回对象类型?

可以隐含地完成:

示例:

gtk_signal_connect(GTK_OBJECT(ptrGUI->CloseButton), "clicked", GTK_SIGNAL_FUNC(completeSignalStrengthTest),(gpointer) ptrGUI);

回调:

void completeSignalStrengthTest(GtkWidget* myWidget,GdkEvent  *event,gpointer   data)
{
    cout<<"Signal Strength test is completed"<<endl;

    GUI* _ptrGUI = (GUI *)data;

也可以使用static_cast&lt;&gt;

明确地完成

我在代码中的很多地方已经看过这个,我正在调试核心转储(可能问题出在其他地方),但它对你在c ++中使用void *的方式有什么影响吗?

3 个答案:

答案 0 :(得分:2)

这是可能的。

要转换为void *,您甚至不需要显式输入它。反过来(来自void *)您将使用static_cast。但是,如果您的对象恰好有const指针,那么您也需要const_cast

在您编写的代码gpointer中,它是什么?是typedef'd void *吗?如果是这样,那没关系。如果没有,您可以使用reinterpret_cast

无论如何,你必须确保你真的只是在传递GUI *,以避免运行时错误。

答案 1 :(得分:0)

操作符reinterpret_cast可用于从对象转换为void*并返回。

其他方法是使用基类并传递基类指针,然后将其转换回派生类。 (但后来它的GTK +)

答案 2 :(得分:-1)

  • 标准方式:是,使用reinterpret_cast或C style cast
  • 安全方式:不,你不能保证被叫方会传递你期望的类型的对象。

在C ++中使用的一种更常见的方法是定义一个接口和通过基指针访问的虚拟方法,但在许多情况下,在处理遗留或C API时,你不得不使用指针和强制转换他们。如果是这种情况,请非常小心如何使用它们。