gpt4 book ai didi

c++ - QSet 中的重复项

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:13 25 4
gpt4 key购买 nike

对于类 X 和 QSet< X* >,如何确保 QSet 不包含重复元素?X 类型的每个对象中的唯一属性是一个 QString,可以使用 getName() 获取它。

我已经实现了 qHash(X*) 函数、operator==()、operator<() 和 operator>(),但是 QSet 仍然接受重复元素,即具有相同名称的元素。

有人可以帮助我完成这项工作吗?


好的。这就是我想要做的。我有一个 Y 类和一个 X 类,它们都继承了 QDialog。 Y 类(槽)中的函数负责生成 X 类的对象。Y 的对话框将负责生成的 X 对象。这就是我在 Y 中创建 QSet< X* > 成员的原因。

最佳答案

问题是你不能重载 operator==像这样:

bool operator==(X*, X*);

这是因为至少有一个参数必须是类类型。

既然你说你实现了operator== ,我想你做了这样的事情:

struct X
{
bool operator==(X*) const;
};

此运算符永远不会在 QSet 时调用试图消除重复项,因为它需要类型为 X 的左参数和类型权X*

我可以看到这个问题的两个可能的解决方案:

  • 不要将您的项目存储为指针(即使用 QSet<X> )。这将允许您重载正确的运算符。然而,这种解决方案并不总是可行的。
  • 如果你能以某种方式强制只有一个对象具有给定的 id,你就可以在你里面存储指针 QSet无需重载任何运算符或 qHash功能。

编辑:如果您的设计允许创建多个 X -具有相同 id 的对象,但您只想在任何时候都存在一个这样的对象,也许最好使用 QMap从 id 映射到 X* .当您创建一个新对象时,执行如下操作:

QString newId = ...;
delete objectsMap[newId];
objectsMap[newId] = new X(newId);

关于c++ - QSet 中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3489315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com