QObject*和void*之间的转换
Converting between QObject* and void*
我正在使用QT 5.7,由于我必须使用的库,我需要将QObject(派生类)转换为void指针。
有几个定义。我有一个只接受void指针的函数,并且我的类派生自QObject:
void oneFunction(void *obj);
class MyObj : public QObject
{
...
};
然后创建并填充一个对象:
MyObj *ptr = new MyObj(parent);
ptr->.......
在某些时候,我将其转换为void指针,因为我必须将其传递给函数。这个强制转换是自动完成的:
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
}
}
现在,整个过程是正确的吗?你发现什么问题了吗?有没有更好的解决方案?
谢谢
我认为一个static_cast
就足够了。
static_cast
不会在运行时检查类型,应该在您确定类型正确时使用。在这种情况下,你是肯定的,你不需要qobject_cast
。qobject_cast
在运行时检查类型(类似于dynamic_cast
)。
目标类型已知的情况下
static_cast
或c风格的强制转换是可以的。尽管c风格的强制转换在这里工作得很好,但不建议这样做,因为:
- c风格的强制类型转换不被编译器检查,而
static_cast
类型转换被检查。 -
static_cast
s更具可读性,可以更容易地搜索。 - 更多信息。
如果目标类型未知
-
当源类型为
QObject *
或其派生时,单个qobject_cast
就足够了。 -
如果源类型为多态性,则使用
dynamic_cast
。换句话说,dynamic_cast
仅用于多态源类型(即至少具有一个虚函数的类)。在这类中,在编译时不能确定指向具有虚方法的基类的指针的最派生类型,只有在运行时才能确定。关于动态强制转换
void*
,允许强制转换到,但不能强制转换自。
在您的情况下,void*
没有任何RTTI,因此qobject_cast
和dynamic_cast
都不能使用
如果
和只有如果你确定指针没有并且永远不会被oneFunction(void*)
以未定义的方式触摸,那么在程序的其他地方强制转换接收该指针并将其类型强制转换回QObject
是安全的。看到这个。
在这种情况下,这是完全有效的:
void callbackFromOneFunction(void *theOldPointer)
{
MyObj *oldPtr = qobject_cast<MyObj*>(static_cast<QObject*>(theOldPointer));
if (oldPtr != nullptr)
{
... Now it's back, so use it
}
}
- 构造函数和转换运算符之间的重载解析
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- Cxx.jl 在 Julia Complex 和 std::complex 之间进行转换
- 如何在 std::string 和 Aws::String 之间进行转换?
- 转换字符时Arduino DUE 和 Arduino UNO 之间的区别
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 在 Rcpp 中的字符串类型之间转换时出错
- 如何声明不同类型的模板化类之间的转换
- C 和 C++ 中的函数指针转换之间的差异
- 与浮点转换之间的规范化整数
- 重新解释强制转换和 C 样式转换之间的 C++ 区别
- C++ get 和类型转换之间的用法有什么区别?我应该使用哪一个?
- printf函数参数之间的序列点;转换之间的顺序点是否重要
- Clang和GCC中不明确基类转换之间的行为差异
- 转换之间的双和字节数组,为传输ZigBee API
- 隐式转换和显式转换之间的区别
- interpret_cast和C样式强制转换之间的区别是什么