【问题标题】:Using QHash in a custom class在自定义类中使用 QHash
【发布时间】:2013-11-17 06:49:24
【问题描述】:

我是 Qt 的新手,正在学习如何处理 QHash 的工作原理。在使用此示例时,我不明白为什么这会引发错误。我可能会错过一些东西,但请指导我学习。

main.cpp

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QHash<QString,Person> hash;
QString key="1";

Person p;
p.name = name;
p.number = an;

hash.insert(key,p); 

    return a.exec();
}

人.h

class Person
{
public:
    Person();
    Person(QString name,QString num);
    bool operator==(const Person & other) const; //== overloading to assign in QHash
    QString name,number;
};

person.cpp

Person::Person()
{
}
Person::Person(QString name, QString num)
{
    this->name=name;
    this->number=num;
}
bool Person::operator==(const Person & other) const
{
    bool state;
    if (name == other.name )
        state = true;
    else
        state = false;

    return state;
}

错误是:-'qHash':17 个重载中没有一个可以转换所有参数类型。我知道我错过了一些东西。请指导我。

【问题讨论】:

  • 您使用的是哪个编译器和 QT 版本?这对我来说编译得很好。
  • 对于自定义类型的键,您需要为该类型提供 qHash 函数。当你使用 QString 时,你应该没问题。
  • 我正在使用 qt creator 2.7
  • 另外,main 中的作业中的“name”和“an”是什么?它们没有在任何地方定义。
  • FWIW,你的 Person::operator== 可以写成 return (name == other.name) 并且是一个很好的内联候选者,但也许你只是为了这个例子而减少了它。

标签: c++ qt


【解决方案1】:

您需要全局 qHash() 函数。

QHash 的键类型除了是 可赋值数据类型:必须提供operator==(),且必须有 也是类型命名空间中的 qHash() 函数,它返回一个哈希值 键类型参数的值。

有关更多信息,请参阅this

【讨论】:

  • @peppe 哦,是的。我没有注意到这一点。这很奇怪。为什么这会解决他的问题..
  • @anbuselvan 实际上你的代码看起来不错。您是否遗漏了一些代码?
  • @thuga 不,prblm 是 qHash() 不是全局的,它在我的 person 类中
  • -1:不看问题就回答?这里的问题不是哈希键而是不可编译的例子。很抱歉投反对票:-(
  • @ValentinHeinitz 没关系。我注意到了错误消息以及他定义了operator==() 的事实,我没有注意到他使用QString 作为哈希表中的键。但事实证明他实际上是使用Person作为key,所以我的回答确实是正确的。
【解决方案2】:

您提供的代码不完整且不可编译 - 例如未找到符号名称,没有包含。

当您将类用作值时,不需要 op ==。值类的唯一要求 - 默认构造函数。

我认为你的问题是别的。如果你提供了完整的代码和完整的错误列表,我可以告诉你到底是什么。

您将在下面找到代码-sn-p 的工作版本。 (为简单起见,所有内容都在一个文件中)

main.cpp

#include <QApplication>
#include <QHash>
#include <QString>

class Person
{
public:
    Person(QString name=QString::null,QString num=QString::null);
    QString name,number;
};


Person::Person(QString _name, QString _num)
:name(_name),number(_num)
{   
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QHash<QString,Person> hash;
    QString key="1";

    Person p("Orhan Kemal", "1914");

    hash.insert(key,p); 
        return a.exec();
}

问候, 瓦伦丁

编辑: 初始化的成员不在正文中

【讨论】:

  • 我想你没有得到我的问题我试图这样设置密钥:- QHash hash; hash.insert(p,key);这显然会抛出错误重载 == 而我确实遇到了错误,因为我忘了实现 qHash() 函数,最后在正确的地方实现它之后解决了
  • 数学上的低点似乎是普遍的:减 * 减 = 加。你提供了错误的例子。有人没有仔细阅读问题并回答了。偶然地,这个答案是正确的(或者您认为适合您的问题的答案)。 :-)
  • 我不明白你把钥匙当作对象有什么问题吗?他们是否违反了 oops 法则@valentin
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多