我想将代码从旧样式转换为新样式。我在理解不同类型的演员时遇到了一些问题。
1例
if (((QDataItem*)(*it))->GetType()==QDataItem::AudioTrack){
在这里,我有一个类“ QDataItem”。其中包含一个音轨类型的枚举,例如AudioTrack。基于QTreeWidget,我遍历QTreeWidget项目。每个项目代表一个QDataItem。现在,我要进行新的投射:
if ((static_cast<QDataItem*>(*it))->GetType()==QDataItem::AudioTrack){
这是正确的方法吗?
2箱 在旧样式中,我要进行两次铸造
QAudioTrackItem *audio_track = (QAudioTrackItem*)(QDataItem*)(*it);
QAudioTrackItem类似于QDataItem一个类。我想在这里做
QAudioTrackItem *audio_track = reinterpret_cast<QAudioTrackItem*>(*it)
但是我不确定在缺少QDataItem强制转换的情况下这是否正确。
我的结果还好吗?还是我有错误?
答案 0 :(得分:1)
这是正确的方法吗?
是的,(QDataItem*)(*it)
和static_cast<QDataItem*>(*it)
应该与您的代码相同。
但是如果您的类具有这样的继承结构:
class QDataItem : QObject {};
class QAudioTrackItem : QDataItem {};
您应该真正考虑改用qobject_cast<>():
if (auto item = qobject_cast<QAudioTrackItem *>(*it)) {
....
}
我的结果还好吗?还是我有错误?
也许,这取决于您的继承结构。
如果它们像我上面的示例一样继承,则完全可以使用reinterpret_cast<>()
在QObject
,QDataItem
和QAudioTrackItem
之间转换任何指针。
但是如果您的类具有多个继承:
class QDataItem {};
class QAudioTrackItem : QObject, QDataItem {};
reinterpret_cast
可能会严重踢屁股:
auto item = new QAudioTrackItem;
auto p1 = reinterpret_cast<QObject *>(item); // OK
auto p2 = reinterpret_cast<QAudioTrackItem *>(p1); // OK
auto p3 = reinterpret_cast<QDataItem *>(item); // Undefined Behavior
auto p4 = reinterpret_cast<QDataItem *>(p1); // Undefined Behavior