使用QT进行新型铸造

时间:2019-08-28 14:48:21

标签: qt

我想将代码从旧样式转换为新样式。我在理解不同类型的演员时遇到了一些问题。

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强制转换的情况下这是否正确。

我的结果还好吗?还是我有错误?

1 个答案:

答案 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<>()QObjectQDataItemQAudioTrackItem之间转换任何指针。

但是如果您的类具有多个继承:

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