3 Контейнерные классы

3.1 Использование иерархии классов

Основная цель данного примера объяснить отношения “является”, которое представлено производными классами.

class Vehicle {

int weight;

public:

Vehicle(void) {}

Vehicle(int aweight): weight(aweight) {}

~Vehicle(void){}

int getweight(void) { return weight; }

void print() { cout << “ weight” << weight;}

};

class Car: public Vehicle {

int horsepower;

public:

Car(void) {}

Car(int aweight,horse): Vehicle(awright),horsepower(horse){}

~Car(void) {}

int gethorse(void) { return horsepower; }

void print(void) { Vehicle::print(); cout << “ horse” << horsepower; }

};

class SportCar: public Car {

float timetosixty;

public:

SportCar(void){}

SportCar(int aweight, int horse, float times) : Car(aweight, horse),

timetosixty(times) {}

float gettimes(void) { return timetosixty; }

void print(void) { Car::print(); cout << “ times” << timetosixty; }

};

3.2 Иерархия классов против контейнерных классов

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

Рассмотрим примеры противопоставления концепции иерархии классов и контейнерного класса. В данном примере они реализованы через определение базового класса Canine, производного класса Dog, и класса Tail, экземпляр которого содержится в Canine.

class Tail {

int length;

public:

Tail(int alength): length(alength) {}

~Tail(void) {}

int getlength(void) { return length; }

};

class Canine {

Tail tail;

int weight;

public:

Canine(int alength,int aweight): tail(alength), weight(aweight) { }

//необходимо вызвать конструктор для класса, который содержится в //данном классе

~Canine(void) {}

Tail getTail(void) { return tail; }

int getWeight(void) { return weight; }

};

class Dog: private Canine {

char *name;

public:

Dog(int alength,int aweight,char *aname): Canine(alength,aweight) {

name = new char[strlen(aname)+1]; strcpy(name,aname); }

~Dog (void) { delete name; }

char *getname(void) { return name; }

void print(void) { cout <<“ name” << name; “ weight” << getweight();

cout << “ length” << getTail().getlength();

} };

main() {

Dog myDog(12,48.7,Alex”);

myDog.print();

}

Инициализация контейнерного объекта внутри класса представлена в многопараметровом конструкторе класса Canine. В этом конструкторе за двоеточием следует специальный вызов параметризованного конструктора класса Tail - tail(length).

Для того, чтобы напечатать длину собачьего хвоста, необходимо послать сообщение getTail(). Это сообщение возвращает экземпляр Tail, который посылает сообщение getlength().

Объекты myDog не имеют прямого доступа к открытой части Canine. Следовательно они не имеют прямого доступа к tail, weight, через открытые методы доступа. Если такие доступы желательны, то необходимо объявить класс Dog как public-производный класс от Canine.

Использование иерархии классов

Основная цель данного примера объяснить отношения “является”, которое представлено производными классами.

class Vehicle {

int weight;

public:

Vehicle(void) {}

Vehicle(int aweight): weight(aweight) {}

~Vehicle(void){}

int getweight(void) { return weight; }

void print() { cout << “ weight” << weight;}

};

class Car: public Vehicle {

int horsepower;

public:

Car(void) {}

Car(int aweight,horse): Vehicle(awright),horsepower(horse){}

~Car(void) {}

int gethorse(void) { return horsepower; }

void print(void) { Vehicle::print(); cout << “ horse” << horsepower; }

};

class SportCar: public Car {

float timetosixty;

public:

SportCar(void){}

SportCar(int aweight, int horse, float times):Car(aweight,horse),

timetosixty(times){}

float gettimes(void) { return timetosixty; }

void print(void) { Car::print(); cout << “ times” << timetosixty; }

};

3.3 Использование контейнерных классов

Рассмотрим другой подход к организации класса, описывающего спортивные автомобили. Все три класса находятся на одном иерархическом уровне и связаны посредством отношения “содержит”. Спортивный автомобиль “содержит” двигатель и “содержит” характеристики. Таким образом, класс SportCar содержит в себе объекты классов Engine и Performance.

class Engine {

int horse;

public:

Engine(void) {}

Engine(int ahorse): horse(ahorse), {}

~Engine(void) {}

int gethorse(void) { return horse; }

void print(void) { cout << “ horse” << horse; }

};

class Performane {

float times;

public:

Performance(void) {}

Performance(float atimes): times(atimes) {}

~Performance(void) {}

float gettimes(void) { return times; }

void print(void) { cout << “ times” << times; }

};

class SportCar {

int weight;

Engine engine;

Performance performance;

public:

SportCar(void) {}

SportCar(int aweight,int adisp,float atimes): engine(ahorse),

<P ALIGN="JUSTIFY"