对于类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>
)。这将允许您重载正确的运算符。但是,这种解决方案并不总是可行的。 QSet
中,而无需重载任何运算符或qHash
函数。 编辑:如果您的设计允许创建多个具有相同id的
X
-object,但您只希望随时存在一个这样的对象,那么最好使用一种从id映射到QMap
的X*
。创建新对象时,请执行以下操作:QString newId = ...;
delete objectsMap[newId];
objectsMap[newId] = new X(newId);