C++ 在QObject*和void之间转换*

C++ 在QObject*和void之间转换*,c++,qt,pointers,casting,C++,Qt,Pointers,Casting,我使用的是Qt5.7,由于我必须使用库,我需要将QObject(“的派生类”)转换为void指针,并将其转换为void指针 有几个定义。我有一个只接受空指针的函数,我的类派生自QObject: void oneFunction(void *obj); class MyObj : public QObject { ... }; 然后我创建并填充一个对象: MyObj *ptr = new MyObj(parent); ptr->....... 在某个时刻,我将它转换为一个空指针

我使用的是Qt5.7,由于我必须使用库,我需要将QObject(“的派生类”)转换为void指针,并将其转换为void指针

有几个定义。我有一个只接受空指针的函数,我的类派生自QObject:

void oneFunction(void *obj);

class MyObj : public QObject
{
    ...
};
然后我创建并填充一个对象:

MyObj *ptr = new MyObj(parent);
ptr->.......
在某个时刻,我将它转换为一个空指针,因为我必须将它传递给函数。此转换将自动完成:

oneFunction(ptr);
然后,过了一段时间,我收到了我传递的指针,我需要将它转换回原始类。指针未被函数修改:

void callbackFromOneFunction(void *theOldPointer)
{
    MyObj *oldPtr = qobject_cast<MyObj*>(static_cast<QObject*>(theOldPointer));
    if (oldPtr != nullptr)
    {
        ... Now it's back, so use it
    }
}
void callbackfromone函数(void*theOldPointer)
{
MyObj*oldPtr=qobject_cast(静态_cast(theOldPointer));
如果(oldPtr!=nullptr)
{
…现在它回来了,用它吧
}
}
现在,整个过程对吗?你发现了什么问题/漏洞吗?有更好的解决办法吗


谢谢你

我认为一个
静态演员
就足够了

static\u cast
不会在运行时检查类型,应该在确定类型正常时使用。在这种情况下,您可以确定,并且不需要
qobject\u cast
qobject\u cast
在运行时检查类型(类似于
dynamic\u cast


在已知目标类型的情况下 一个
static_cast
或C风格的cast就可以了。虽然C-style cast在这里工作正常,但不推荐使用,因为:

  • 编译器不检查C样式转换,而
    static\u cast
    s检查
  • static\u cast
    s更具可读性,更易于搜索
如果目标类型未知
  • 当源类型为
    QObject*
    或其派生类型时,一个
    QObject\u cast
    就足够了

  • 如果源类型是多态的,则使用
    dynamic\u cast
    。换句话说,
    dynamic_cast
    仅用于多态源类型(即至少具有一个虚拟函数的类)。在这样的类中,在编译时我们无法确定指向具有虚拟方法的基类的最派生的指针类型,只有在运行时我们才能确定它们

    关于动态强制转换
    void*
    ,允许向进行强制转换,但不能从中进行强制转换

在您的情况下,
void*
没有,因此既不能使用
qobject\u cast
也不能使用
dynamic\u cast

如果只有当您确定指针没有并且永远不会被
oneFunction(void*)
以这样的方式触摸时,然后可以在程序中的其他位置强制转换接收该指针,并键入cast将其转换回
QObject
。看

在这种情况下,这是完全正确的:

void callbackFromOneFunction(void *theOldPointer)
{
    MyObj *oldPtr = qobject_cast<MyObj*>(static_cast<QObject*>(theOldPointer));
    if (oldPtr != nullptr)
    {
        ... Now it's back, so use it
    }
}
void callbackfromone函数(void*theOldPointer)
{
MyObj*oldPtr=qobject_cast(静态_cast(theOldPointer));
如果(oldPtr!=nullptr)
{
…现在它回来了,用它吧
}
}

如果通过隐式转换从
myObject*
转换为
void*
,则需要将
静态\u转换回
myObject*
,而不是
QObject*
。只有在类型完全相同的情况下才能保证往返。解决方案2(仅
qobject\u cast
)的问题是
qobject\u cast
需要一个
qobject*
,而不是
void*
,因此一个不是足够的类型转换应该避免。@rubenvb你说得对<为了可读性和被编译器检查,代码>静态转换比C样式转换更可取。更新了我的答案。它们也不等价:C风格的铸件与任何C++的铸件仍然有很大的不同,请参阅。我说两个强制转换都是有效的,即使是通过它推荐不要在C++中使用C风格的强制转换。