Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QT铸造新工艺_Qt - Fatal编程技术网

QT铸造新工艺

QT铸造新工艺,qt,Qt,我想将我的代码从旧样式转换更新为新样式。我在理解不同类型的强制类型时遇到一些问题 1例 if (((QDataItem*)(*it))->GetType()==QDataItem::AudioTrack){ 这里我有一个类“QDataItem”。这包含曲目类型的枚举,如AudioTrack。基于QTreeWidget,我迭代了QTreeWidget项。每个项目代表一个QDataItem。现在有了新的演员阵容,我想做: if ((static_cast<QDataItem*>(

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

1例

if (((QDataItem*)(*it))->GetType()==QDataItem::AudioTrack){
这里我有一个类“QDataItem”。这包含曲目类型的枚举,如AudioTrack。基于QTreeWidget,我迭代了QTreeWidget项。每个项目代表一个QDataItem。现在有了新的演员阵容,我想做:

if ((static_cast<QDataItem*>(*it))->GetType()==QDataItem::AudioTrack){
QAudioTrackItem类似于QDataItem类。我想在这里做:

QAudioTrackItem *audio_track = reinterpret_cast<QAudioTrackItem*>(*it)
QAudioTrackItem*audio\u track=reinterpret\u cast(*it)
但我不确定在缺少QDataItem的情况下这是否正确

我的结果正常还是有错误

这样做对吗

是的,
(QDataItem*)(*it)
静态转换(*it)
应该与您的代码相同

但是如果您的类具有这样的继承结构:

class QDataItem : QObject {};
class QAudioTrackItem : QDataItem {};
<>你应该考虑使用:

reinterpret\u 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
auto item=新的QAudioTrackItem;
自动p1=重新解释铸件(项目);//好啊
自动p2=重新解释铸件(p1);//好啊
自动p3=重新解释铸件(项目);//未定义的行为
自动p4=重新解释铸件(p1);//未定义的行为

你为什么需要在这里施放?
*it
的类型是什么?所有这些类型在类层次结构中是如何关联的?而且,
reinterpret\u cast
几乎总是错误的,它只有很少的有效用例。这可能不是其中之一。。。取决于您正在强制转换的内容和原因。顺便说一句,
QObject\u cast
可以降低QObject的后代的成本。@hyde我用QDataItems迭代了一个QTreeWidget。但是要访问QDataItem“GetType”,我需要告诉代码它不是QTReeWidget项,而是QDataItem。但是如果reinerpret是错误的,我必须用什么来代替(QAudioTrackItem*)(QDataItem*)(*it);?我认为重新解释演员阵容是一种“强制”演员阵容。是否需要替换为两个静态类型?是的,QAudioTrackItem为:class QAudioTrackItem:public QDataItem。那么对象投射是正确的选择吗?@ingo你是说QTreeWidgetItem?如果QDataItem是QTreeWidgetItem的别名或子类,则no.QTreeWidgetItem不会继承QObject,因此在这种情况下不能使用QObject_cast()。
if (auto item = qobject_cast<QAudioTrackItem *>(*it)) {
    ....
}
class QDataItem {};
class QAudioTrackItem : QObject, QDataItem {};
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