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

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

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

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

最佳答案

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

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

这是因为至少一个自变量必须是类类型。

因为您说您实现了operator==,所以我想您做了类似的事情:
struct X
{
    bool operator==(X*) const;
};

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

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

  • 编辑:如果您的设计允许创建多个具有相同id的X -object,但您只希望随时存在一个这样的对象,那么最好使用一种从id映射到QMapX*。创建新对象时,请执行以下操作:
    QString newId = ...;
    delete objectsMap[newId];
    objectsMap[newId] = new X(newId);
    

    09-04 16:18