blob: c9ac3f7fc3372abeedc10ec8642c5e955bfb7b6c [file] [log] [blame]
// Listing 4.1 page 72, from "C++ Programming Style" by
// Tom Cargill. Addison Wesley, 1992.
#include <stdio.h>
#include <string.h>
class Vehicle {
protected:
char *plate;
public:
Vehicle() {plate = NULL;}
Vehicle(char *p) {
plate = new char[strlen(p)+1];
strcpy(plate,p);
}
~Vehicle() {delete [] plate;}
virtual void identify() {
printf("generic vehicle\n");
}
};
class Car : public Vehicle {
public:
Car() : Vehicle() {}
Car(char *p) : Vehicle(p) {}
void identify() {
printf("car with plate %s\n", plate);
}
};
class Truck : public Vehicle {
public:
Truck() : Vehicle() {}
Truck(char *p) : Vehicle(p) {}
void identify() {
printf("truck with plate %s\n", plate);
}
};
class Garage {
int maxVehicles;
Vehicle **parked;
public:
Garage(int max);
~Garage();
int accept(Vehicle *);
Vehicle *release(int bay);
void listVehicles();
};
Garage::Garage(int max) {
maxVehicles = max;
parked = new Vehicle* [maxVehicles];
for (int bay = 0; bay < maxVehicles; ++bay)
parked[bay] = NULL;
}
Garage::~Garage() {
delete [] parked;
}
int Garage::accept(Vehicle *veh) {
for (int bay=0; bay < maxVehicles; ++bay)
if (!parked[bay]) {
parked[bay] = veh;
return bay;
}
return -1; // no bay available
}
Vehicle *Garage::release(int bay) {
if (bay < 0 || bay >= maxVehicles)
return NULL;
Vehicle *veh = parked[bay];
parked[bay] = NULL;
return veh;
}
void Garage::listVehicles() {
for (int bay=0; bay < maxVehicles; ++bay)
if (parked[bay]) {
printf("Vehicle in bay %d is: ", bay);
parked[bay]->identify();
}
}
Car c1("RVR 101");
Car c2("SPT 202");
Car c3("CHP 303");
Car c4("BDY 404");
Car c5("BCH 505");
Truck t1("TBL 606");
Truck t2("IKY 707");
Truck t3("FFY 808");
Truck t4("PCS 909");
Truck t5("SLY 000");
// LLVM: add main return type.
int main () {
Garage park(15);
park.accept(&c1);
int t2bay = park.accept(&t2);
park.accept(&c3);
park.accept(&t1);
int c4bay = park.accept(&c4);
park.accept(&c5);
park.accept(&t5);
park.release(t2bay);
park.accept(&t4);
park.accept(&t3);
park.release(c4bay);
park.accept(&c2);
park.listVehicles();
return 0;
}