Глава 18. Классы-контейнеры 449
class STODENT_KEY
{
public:
STUDENT_KEY() : id("") {)
STUDENT_KEY(const string &id_) : id(id_) {} STUDENT_KEY(const char *id_) : id(id_) {} STUDENT_KEY(const STUDENT_KEY Skey) { *this = key; } ~STUDENT__KEY() ()
STUDENT_KEYS operator=(const STUDENT_KEY &rhs) {
if (this != &rhs) . // Избежать самокопирования. id = rhs.id;
return *this;
}
// Сравнение ДОЛЖНО быть определено
int operator==(const STUDENT KEY &rhs) const { return id == rhs.id; } int operator<(const STUDENT KEY &rhs) const '{ return id < rhs.id; } const strings GetIdO const ( return id; } // требуемая функция:
unsigned HashValueO const { return id.hashO; } private:
string id;
} •' '
Конструкторы ассоциативных классов-шаблонов принимают два параметра:
ключ и связанное с ключом значение. Оба они могут быть как прямыми, так и косвенными. Для объекта STUDENT в качестве значения и объекта STUDENT_KEY в качестве ключа, ассоциативными классами будут:
typedef TDDAssociation<STUDENT_KEY, STUDENT> STUDENT_DDASSOC;
// Ключ прямой, значение прямое typedef TDIAssociation<STUDENT_KEY, STUDENT> STl-jDENT_DIASSOC;
// Ключ прямой, значение косвенное typedef TIDAssociation<STUDENT_KEY, STUDENT> STUDENT_IDASSOC;
// Ключ косвенный, значение прямое typedef TIIAssociation<STUDENT_KEY, STUDENT> STUDENT_IIASSOC;
// Косвенный ключ, косвенное значение
Определение ассоциативной переменной может быть записано как:
STUDENT s("SamJohnson", 3.4);
STUDENTJKEY skey(s.Getid());
STUDENT_DDASSOC sAssocfskey, s) ;
// Оба параметра переданы по значению.
Функция-член HashValue возвращает результат своего объекта-ключа.
Функции-члены Key и value возвращают соответственно ключ и значение объектов. Прямые объекты возвращаются по значению: