包含派生对象的QPointer和基类不匹配
QPointer containing derived object wont match one with the baseclass
对于wierd标题感到抱歉,如果你能想到一个更好的,请随时提出。
这是我的问题。
我有一个看起来像这样的结构:
QObject->MyBase->MyDerived
然后我有一个函数,它将把任何派生类型作为QPointer;
void function(QPointer<MyBase> base) {
...
}
现在的问题是,我不能将QPointer<MyDerived>
传递到这个函数中,如果我使用标准指针,我会这样做。我必须强制转换这个对象以使其适合函数吗?还是应该只使用普通指针?
另外,当你分配一个失败的对象时,有人知道标准行为吗?你应该总是在try块中这样做,还是用一些东西包装它来检查它是否为null?我阅读了Qt文档,他们说如果分配失败,他们的大多数类都会返回null值。这个说法什么时候成立?如果我不想使用try-catch,我该怎么办?
您应该使用普通指针。这就是Qt文档关于使用QPoiner 的说明
"保护指针将自动转换为T*,因此您可以自由混合保护指针和非保护指针。这意味着,如果您有一个QPointer<QWidget>,您可以将其传递给需要QWidget*的函数。因此,声明函数将QPointer作为参数没有什么价值;*只使用普通指针*随着时间的推移,按一下指针。"
正如@Kunal所提到的,在您的情况下最好传递原始指针,但我看到您遇到了指针所有权问题。将原始指针传递到对象的方法是危险的,因为当代码库增长时,您很快就会混淆哪个对象是该特定指针的所有者,这很容易导致内存泄漏。出于这个原因,我建议使用QSharedPointer,而不是QPointer,甚至是原始指针。QSharedPointer支持多态性,因此您可以将其(作为值)传递给您想要的任何函数/对象,而无需担心所有权,因为QSharedPPointer将获得指针的所有权,并在QSharedPpointer的所有最后一个实例超出范围时将其删除。
- C4018:类内有符号、无符号不匹配
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 被覆盖的函数不会反映在基类中,这是正常行为吗?
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- 重写打印函数而不是覆盖基类
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 模板专用化与派生类不匹配
- C++正则表达式字符类不匹配
- 为什么嵌套类型的基类不需要"typename"?
- 派生类可以具有C 基类不在基类中的构造函数吗?
- 如何查看 cppdepend 的分析流程(例如,对于基类不应使用导数)
- 当基类不是多态但派生时,"this"地址不匹配是
- 覆盖基类的虚函数,这些基类不共享公共接口
- 当基类不包含数据成员时,虚拟继承是否仍然是必要的
- 包含派生对象的QPointer和基类不匹配
- 如何在基类(不是模板类)中调用c++模板函数
- 用子类调用时匹配模板而不是基类的重载函数模板
- 为什么基类不会在同一"auto"声明中自动推导?
- 构造所有基类不需要默认生成的构造函数