//building.h //Final version. #ifndef BUILDING_H #define BUILDING_H #include #include #include using namespace std; class Visitor; class Street; class Building; class Renter; class Structure; class Object{}; class Visitor : public Object { protected: int success; int indent; public: Visitor() {success = 0; indent = 0;}; virtual void setSuccess(int i) { success = i;}; void printindent(){ for (int i = 0; i < indent; i++) cout<< "\t";}; virtual void visit(Street *) = 0; virtual void visit(Building *) = 0; }; class Renter : public Visitor { private: int success; string name; public: Renter(string n) : Visitor() {name = n;}; virtual void setSuccess(int i) { success = i;}; virtual string getName(){return name;}; virtual void visit(Street * s); virtual void visit(Building * b); }; class Structure : public Object { protected: string name; string materials; int size; string function; Structure * parent; public: Structure (){}; virtual void SetName(const string& s) {name = s;}; virtual void SetBuildingMaterials(const string& s) { materials = s;}; virtual void SetFunction(const string& s) {function = s;}; virtual void SetSize(const int& s) {size = s;}; virtual string GetName() {return name;}; virtual string GetBuildingMaterials() {return materials;}; virtual string GetFunction() {return function;}; virtual int GetTotalRooms() = 0; virtual int GetOccupancy() = 0; virtual void LookAt() = 0; virtual void ListRenters() = 0; virtual int GetNumBuildings() {return -1;}; virtual int GetNumLotsTotal() {return -1;}; virtual Structure * GetParent() {return parent;}; virtual void SetParent(Structure * s) {parent = s;}; virtual void accept(Visitor * v) = 0; virtual int addStructure(Structure* ){return -1;}; virtual int addRenter(Renter* ){return -1;}; Renter * GetRenter(int index){return NULL;}; }; class Building : public Structure { protected: vector * renters; public: Building() {renters = new vector();}; virtual int GetOccupancy() {return (renters->size());} virtual int GetTotalRooms(){return size;}; Renter * GetRenter(int index){return renters->at(index);}; int addRenter(Renter* renter){ if (GetOccupancy() < GetTotalRooms()) { renters->push_back(renter); return 0;} else return -1; } virtual void ListRenters(){ cout << GetOccupancy() << " renter(s) in this building.\n"; for (int i = 0; i < GetOccupancy(); i++) cout << GetRenter(i)->getName() << " lives here.\n"; } void LookAt(){ cout << "A "<< GetName()<< " made of "<< GetBuildingMaterials() << ", "<< GetTotalRooms()<< " residential rooms, " << GetTotalRooms() - GetOccupancy() << " availible, with the function of " << GetFunction() <visit(this);}; }; class Street : public Structure { protected: vector * buildings; public: Street(){ buildings = new vector();}; virtual int GetNumBuildings(){return buildings->size();}; virtual int GetNumBuildingsTotal(){return (size - buildings->size());};; Structure * getLot(int index){ return buildings->at(index); } virtual void ListRenters(){ cout << GetOccupancy() << " renter(s) on this street.\n"; for (int i = 0; i < GetNumBuildings(); i++){ cout << "In " << buildings->at(i)->GetName() << ":\n"; buildings->at(i)->ListRenters(); } } virtual int GetTotalRooms(){ int k = 0; for(int i = 0; i < GetNumBuildings(); i++) { k += getLot(i)->GetTotalRooms(); } return k; } virtual int GetOccupancy(){ int k = 0; for(int i = 0; i < GetNumBuildings(); i++) { k += getLot(i)->GetOccupancy(); } return k; } int addStructure(Structure* building) { if (GetNumBuildings() >= GetNumBuildingsTotal()) return -1; building->SetParent(this); buildings->push_back(building); return 0; }; void LookAt() { cout << "A "<< GetName()<< " made of "<< GetBuildingMaterials()<< ", with "<< GetNumBuildings()<< " building(s) built on it, and "<visit(this);}; }; class StructureBuilder : public Object { public: virtual Structure * getStructure() = 0; virtual void newStructure() = 0; virtual void buildBuildingMaterials() = 0; virtual void buildSize() = 0; virtual void buildFunction() = 0; virtual int addStructure(Structure *) {return -1;}; }; class BuildingBuilder : public StructureBuilder { protected: Building * myBuilding; public: BuildingBuilder() {}; Building * getBuilding(){return myBuilding;}; Structure * getStructure() {return myBuilding;}; virtual void newStructure() = 0; virtual void buildBuildingMaterials() = 0; virtual void buildSize() = 0; virtual void buildFunction() = 0; }; class StreetBuilder : public StructureBuilder { protected: Street * myStreet; int i; public: StreetBuilder() : StructureBuilder() {i = 0;}; virtual Street * getStreet(){return myStreet;}; virtual Structure * getStructure() {return myStreet;}; virtual void newStructure() = 0; virtual void buildBuildingMaterials() = 0; virtual void buildSize() = 0; virtual void buildFunction() = 0; virtual int addStructure(Structure *) = 0; }; class ConcreteRoadBuilder : public StreetBuilder { void newStructure(){myStreet = (new Street());myStreet->SetName("Concrete Road");}; void buildBuildingMaterials() {myStreet->SetBuildingMaterials("concrete");}; void buildSize(){ myStreet->SetSize(10);}; void buildFunction() { myStreet->SetFunction("to be a nice street");}; int addStructure(Structure * b){ return myStreet->addStructure(b); }; }; class HouseBuilder : public BuildingBuilder { public: void newStructure(){myBuilding = (new Building());myBuilding->SetName("House");}; void buildBuildingMaterials() {myBuilding->SetBuildingMaterials("wood");}; void buildSize() {myBuilding->SetSize(4);}; void buildFunction() {myBuilding->SetFunction( "keep you dry when it rains");}; }; class SkyscraperBuilder : public BuildingBuilder { public: void newStructure(){myBuilding = (new Building());myBuilding->SetName("Skyscraper");}; void buildBuildingMaterials() {myBuilding->SetBuildingMaterials("steel");}; void buildSize() {myBuilding->SetSize(100);}; void buildFunction() {myBuilding->SetFunction( "to gouge people visiting the viewing deck");}; }; class SchoolBuilder : public BuildingBuilder { public: void newStructure(){myBuilding = (new Building());myBuilding->SetName("School");}; void buildBuildingMaterials() {myBuilding->SetBuildingMaterials("brick");}; void buildSize() {myBuilding->SetSize(0);}; void buildFunction() {myBuilding->SetFunction( "to make you learn something useful (maybe)");}; }; class Contractor { private: StructureBuilder *myBuilder; public: void setBuilder(StructureBuilder * b){if (myBuilder != NULL) delete myBuilder; myBuilder = b;}; Structure * getStructure(){ return myBuilder->getStructure();}; Structure * construct() { myBuilder->newStructure(); myBuilder->buildBuildingMaterials(); myBuilder->buildSize(); myBuilder->buildFunction(); return getStructure(); } Structure * construct(StructureBuilder * b) { myBuilder = b; return this->construct(); } Structure * addStructureToStreet(StructureBuilder * b){ Contractor * subContractor = new Contractor(); subContractor->setBuilder(b); Structure * building = subContractor->construct(); if (myBuilder->addStructure(building) == -1){ cerr <<"Error adding building\n"; delete subContractor; return NULL;} return (subContractor->getStructure()); } void addStructureToStreet(Structure * b){ if (myBuilder->addStructure(b) == -1) cerr<<"Error adding building\n"; } }; void Renter::visit(Street * s) { printindent(); indent++; if(success == 1) return; cout << getName() << " is walking down a " << s->GetName() << " looking for a room.\n"; for (int i = 0; i < s->GetNumBuildings(); i++){ s->getLot(i)->accept(this); if(success == 1) return; } cout << "No rooms availible on this street.\n"; indent--; } void Renter::visit(Building * b) { printindent(); if(success == 1) return; if (b->GetTotalRooms() > b->GetOccupancy()) { b->addRenter(this); success = 1; cout <GetName() << endl; } else { cout <GetName() <<" has no rooms availibile, moving on..."<< endl; } } #endif