Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QHash
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
k0p4
Здравствуйте. Есть проблемка. Не могу засунуть собственный клас в QHash, вот такой код :
hash.h :
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
#include <QtGui>
#include <QString>
#include <QHash>

class Employee
{
public:
     Employee() {}
     Employee(const QString &name, const QDate &dateOfBirth);


private:
     QString myName;
     QDate myDateOfBirth;
};

inline bool operator==(const Employee &e1, const Employee &e2)
{
     return e1.name() == e2.name()
            && e1.dateOfBirth() == e2.dateOfBirth();
}

inline uint qHash(const Employee &key)
{
     return qHash(key.name()) ^ key.dateOfBirth().day();
}

#endif // EMPLOYEE_H
hash.cpp:
#include "hash.h"
#include <QtGui>
#include <QHash>
#include <QString>

Employee::Employee(const QString &name, const QDate &dateOfBirth)
{
    QHash<QString, Employee  *> hash;


}


Покажите плз ошибки, очень надо, за ранее благодарен.
kibsoft
Че компилятор то выдает? Какие ошибки?
Litkevich Yuriy
Цитата(k0p4 @ 16.2.2010, 23:57) *
Не могу засунуть собственный клас в QHash
а что собственно значит "не могу засунуть" не компилируется? тогда какую ошибку получаешь?
k0p4
Цитата
Че компилятор то выдает? Какие ошибки?


c:/users/k0p4/documents/testhash/hash.h:21: error: 'name' : is not a member of 'Employee'
c:/users/k0p4/documents/testhash/hash.h:22: error: 'dateOfBirth' : is not a member of 'Employee'
c:/users/k0p4/documents/testhash/hash.h:27: error: left of '.day' must have class/struct/union
C:/Users/k0p4/Documents/testHash/main.cpp:8: error: 'show' : is not a member of 'Employee' \\ подозреваю, что тут у меня главная ошибка...
, причём 1 и 2 ошибка повторяються раз по пять.
Litkevich Yuriy
Цитата(k0p4 @ 16.2.2010, 23:57) *
QString myName;
QDate myDateOfBirth;
Цитата(k0p4 @ 16.2.2010, 23:57) *
key.name()
Цитата(k0p4 @ 16.2.2010, 23:57) *
key.dateOfBirth()
k0p4
поправил так :
Раскрывающийся текст
private:
     QString Name;
     QDate DateOfBirth;

ошибки абсолютно те же.
Litkevich Yuriy
Цитата(k0p4 @ 17.2.2010, 0:16) *
поправил так :
а почему так?

В одном простом примере троли наделали ошибок.
1) Имена переменных-членов класса не совпадают с тем что во встраиваемых функциях
2) Переменные-члены закрытые, а функции не дружественные.
k0p4
кстати, надо было переменные в конструкторе определять не в конструкторе?, т.е
Раскрывающийся текст
QString name;
QString dateOfBirth;
Employee() {}
Employee(const QString &name, const QDate &dateOfBirth);

после этой записи совсем другие ошибки...
c:/users/k0p4/documents/testhash/hash.h:21: error: term does not evaluate to a function taking 0 arguments
Litkevich Yuriy
Цитата(k0p4 @ 17.2.2010, 0:28) *
переменные в конструкторе определять не в конструкторе?
не понял
k0p4
Цитата
2) Переменные-члены закрытые, а функции не дружественные.

это я исправил, сразу же после своего поста, потому как дошло. т.е. я определил переменные как паблик.



помимо этой записи
Employee(const QString &name, const QDate &dateOfBirth);
, переменные name, dateOfBirth, должны быть где-то определены?
Litkevich Yuriy
Цитата(k0p4 @ 17.2.2010, 0:33) *
переменные name, dateOfBirth, должны быть где-то определены?
чтобы не иметь проблем в конструкторе при инициализации внутренних переменных класса, входными аргументами конструктора. Лучше оставить имена внутренних переменных как есть, а исправить имена переменных в inline-функциях
k0p4
т.е. код должен выглядеть так?
Раскрывающийся текст
public:     
     Employee() {}
     Employee(const QString &name, const QDate &dateOfBirth);

     QString myName;
     QDate myDateOfBirth;
};

inline bool operator==(const Employee &e1, const Employee &e2)
{
     return e1.name() == e2.name() //  'name' : is not a member of 'Employee'
            && e1.dateOfBirth() == e2.dateOfBirth();
}

inline uint qHash(const Employee &key)
{
     return qHash(key.myName()) ^ key.myDateOfBirth().day();
}


BRE
Раскрывающийся текст
public:     
     Employee() {}
     Employee(const QString &name, const QDate &dateOfBirth);

     QString myName;
     QDate myDateOfBirth;
};

inline bool operator==(const Employee &e1, const Employee &e2)
{
    // У тебя в классе Employee разве есть метод name()? Вроже нет... А ты пытаешься его вызвать, о чем тебе компилятор и говорит
     return e1.name() == e2.name() //  'name' : is not a member of 'Employee'
    // также у тебя нет метода dateOfBirth()...
            && e1.dateOfBirth() == e2.dateOfBirth();
}

inline uint qHash(const Employee &key)
{
    // У тебя нет метода myName() и myDateOfBirth(), есть такие переменные.
     return qHash(key.myName()) ^ key.myDateOfBirth().day();
}


Пока ты не выучишь C++ писать на нем не получиться. ;)
http://www.proklondike.com/books/cpp/straustrup_cpp.html
Litkevich Yuriy
Чёт я на функции вообще внимания не обратил

тогда в изначальный код можно было бы и самим тролям добавить пару открытых функций:
QString name(){return myName;}
QDate dateOfBirth(){return myDateOfBirth;}
BRE
Цитата(Litkevich Yuriy @ 16.2.2010, 22:00) *
тогда в изначальный код можно было бы и самим тролям добавить пару открытых функций:


Юра, они это подразумевали под ... :)
class Employee
{
public:
     Employee() {}
     Employee(const QString &name, const QDate &dateOfBirth);
     ...

private:
     QString myName;
     QDate myDateOfBirth;
};
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.