Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ QHash

Автор: k0p4 16.2.2010, 20:57

Здравствуйте. Есть проблемка. Не могу засунуть собственный клас в 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 16.2.2010, 21:04

Че компилятор то выдает? Какие ошибки?

Автор: Litkevich Yuriy 16.2.2010, 21:12

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

Автор: k0p4 16.2.2010, 21:12

Цитата
Че компилятор то выдает? Какие ошибки?


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 16.2.2010, 21:14

Цитата(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 16.2.2010, 21:16

поправил так :

Раскрывающийся текст
private:
     QString Name;
     QDate DateOfBirth;

ошибки абсолютно те же.

Автор: Litkevich Yuriy 16.2.2010, 21:27

Цитата(k0p4 @ 17.2.2010, 0:16) *
поправил так :
а почему так?

В одном простом примере троли наделали ошибок.
1) Имена переменных-членов класса не совпадают с тем что во встраиваемых функциях
2) Переменные-члены закрытые, а функции не дружественные.

Автор: k0p4 16.2.2010, 21:28

кстати, надо было переменные в конструкторе определять не в конструкторе?, т.е

Раскрывающийся текст
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 16.2.2010, 21:30

Цитата(k0p4 @ 17.2.2010, 0:28) *
переменные в конструкторе определять не в конструкторе?
не понял

Автор: k0p4 16.2.2010, 21:33

Цитата
2) Переменные-члены закрытые, а функции не дружественные.

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



помимо этой записи
Employee(const QString &name, const QDate &dateOfBirth);
, переменные name, dateOfBirth, должны быть где-то определены?

Автор: Litkevich Yuriy 16.2.2010, 21:38

Цитата(k0p4 @ 17.2.2010, 0:33) *
переменные name, dateOfBirth, должны быть где-то определены?
чтобы не иметь проблем в конструкторе при инициализации внутренних переменных класса, входными аргументами конструктора. Лучше оставить имена внутренних переменных как есть, а исправить имена переменных в inline-функциях

Автор: k0p4 16.2.2010, 21:46

т.е. код должен выглядеть так?

Раскрывающийся текст
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 16.2.2010, 21:52

Раскрывающийся текст
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 16.2.2010, 22:00

Чёт я на функции вообще внимания не обратил

тогда в изначальный код можно было бы и самим тролям добавить пару открытых функций:

QString name(){return myName;}
QDate dateOfBirth(){return myDateOfBirth;}

Автор: BRE 16.2.2010, 22:02

Цитата(Litkevich Yuriy @ 16.2.2010, 22:00) *
тогда в изначальный код можно было бы и самим тролям добавить пару открытых функций:


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

private:
     QString myName;
     QDate myDateOfBirth;
};

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)