在这种情况下,qobject_cast不应该默默地失败吗?
Shouldn't qobject_cast fail silently in this case?
我正在尝试用Qt编写一个应用程序,在我遇到这个愚蠢的问题之前,该应用程序运行得相对较好。我有一个Node
类,它可以有一个指向Workplace
类实例的指针。我还为该指针定义了 getter/setter 方法。像这样:
class Node : public QGraphicsItem
{
Q_DECLARE_TR_FUNCTIONS(Node)
public:
Node(const QString &type, Project* nodeProject);
~Node();
void setWorkplace(Workplace* workplace);
void removeWorkplace();
Workplace* usedWorkplace();
(...)
private:
Workplace* myWorkplace;
}
因此,现在在我的代码中,我必须检查某个Node
是否具有指向已定义Workplace
的指针,以便对该信息执行一些操作。我是这样做的:
Workplace* currentWorkplacePointer = qobject_cast<Workplace*>(node->usedWorkplace());
if(!currentWorkplacePointer){
// no workplace, do some stuff
}else{
// workplace exists, do other stuff
}
这工作得很好,但现在由于某种原因它随机出现故障。我说随机是因为有时,如果我尝试清理和重建项目,它会正常工作 - 即,qobject_cast
默默失败并按我的预期进行;其他时候,即使我清理/重建,它也会再次出现故障。
调试器控制台始终指向上面的代码中的对象强制转换行。据我所知,如果铸造的对象不存在,强制转换不应该只是默默地失败吗?
请注意,我对Qt/C++非常陌生,所以任何帮助和评论都值得赞赏 - 请温柔一点! :)提前感谢!
正如塞巴斯蒂安·雷德尔(Sebastian Redl)所说,在本身类型中投射指针似乎是无稽之谈。尽管如此,您的代码可以改进以用于将来的强制转换。我的第一点来自qobject_cast文档,这些文档强制调用类标头中的Q_OBJECT
宏才能使用。
其次,由于您的Node
继承了QGraphicsItem
,我建议改用qgraphicsitem_cast
,在处理或过滤场景中存在的项目时,它以不同的方式更快。根据文档改编
class Node : public QGraphicsItem
{
...
enum { Type = UserType + 1 };
int type() const
{
// Enable the use of qgraphicsitem_cast with this item.
return Type;
}
...
}
//in your application code
Node *n = qgraphicsitem_cast<Node*>(expected_pointer_on_node);
if (n) {
//then n points a Node
}
这实际上比我想象的要简单得多,我的问题实际上与 node->usedWorkplace()
方法无法返回任何内容有关,因为在我尝试获取它之前Workplace*
没有初始化。 哑巴,我知道...
因此,我只是将指针初始化为 0
(谢谢你,@ratchetfreak),然后从那里开始工作。现在一切正常。
因此,当我创建 Node
的实例时,我以这种方式初始化指针0
:
nodeToPlace->setWorkplace(0);
然后,当我想检查Node
实例是否存在Workplace*
时:
Workplace* tempWorkplace = node->usedWorkplace();
if(!tempWorkplace){
// do stuff
}else{
// other stuff
}
所以我实际上根本不需要qobject_cast
。
注意:这最终没有与我关于qobject_cast
无声失败的问题有关/回答。我最终发现的是,如果cast
失败或您尝试将0
投射到某物中,会返回0
。我认为在我的初始代码中,后者正在发生。
来自IBM Linux Compilers文档(根据Qt的文档,向C++的dynamic_cast
报告大致相同):
表达式 dynamic_cast(v) 将表达式 v 转换为类型 T。 类型 T 必须是指向完整类类型的指针或引用,或者 指向 void 的指针。如果 T 是指针和 dynamic_cast 运算符 失败时,运算符返回 T 类型的空指针。如果 T 是 引用和dynamic_cast运算符失败,运算符抛出 异常标准::bad_cast。
因此,我会得出结论,我将垃圾称为演员表的参数,这使我的应用程序 seg 出错(正如评论中@hyde提到的,因此我也对他 +1)。
如果有人有不同的意见和/或解释,请告诉我 - 我想了解更多关于我的错误/错误。
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- Eigen如何在容器循环中干净地附加矩阵
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- C++ OpenSSL EVP_DigestVerify间歇性地失败 rsa_pk1.c:103 并RSA_R_BAD_
- CodeBlocks成功地编译了,但海湾合作委员会失败了,为什么
- JNI_CreateJavaVM() 每隔一次运行应用程序时都会失败(确切地说)
- 在这种情况下,qobject_cast不应该默默地失败吗?
- 如何在多线程应用程序中从断言失败中优雅地退出
- VC++类在新构建中失败,但在添加空白后神秘地构建
- 代码使用cmake干净地构建,当作为外部项目添加时失败