【问题标题】:QList::contains with a QSharedPointerQList::contains 带有一个 QSharedPointer
【发布时间】:2015-10-22 17:49:01
【问题描述】:

所以我有一个具有 id 数据成员的类,我在 QList<QSharedPointer<MyClass>> 中使用它,但我不确定如何检查该 QList 中是否存在现有 id。我将如何做到这一点,就像QList::contains 需要QSharedPointer<MyClass>& 而不是MyClass*

我应该只使用以 id 作为键的 QHash 吗?

【问题讨论】:

  • 选择使用什么容器 - 这是您的决定。要选择使用哪个容器,您应该了解容器提供的每个操作的算法复杂度。
  • 如果您的软件运行到您获得原始 MyClass* 的情况,而在其他情况下它被 QSharedPointer 持有,那么您的设计肯定有问题。 QSharedPointer 的整体思想是将对象始终作为 QSharedPointer 传递。否则,您的代码中可能会出现无效指针
  • @KamilKlimek 抱歉,我的意思是,如果我不使用 QSharedPointer,我只会编写一个运算符重载,然后应该可以使用 contains
  • 你不能为 poitner 类型覆盖 operator==

标签: c++ qt qlist qsharedpointer


【解决方案1】:

QList::contains 算法基于== operator。如 Qt 文档中所述,如果两个托管原始指针的值具有相同的值,QSharedPointer== operator 将返回 true

此外,如果您在 QList 中使用了原始指针,它将无法工作,因为您无法覆盖原始指针的 == operator(您在列表中有指向 MyObject 的指针而不是对象,因此重载的 @987654329 @ 的 MyObject 将不会被调用)。

唯一的解决方案是手动迭代列表并使用 for 循环检查是否相等。

【讨论】:

  • 出于某种原因,我认为如果它包含MyClass*,它会调用正确的==。虽然我想如果是这样的话,我最终会用std::find_if 创建自己的支票。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多