#include "example.h" int MotorCar::DesignOpinion::AceDesignCount = 0; int MotorCar::DesignOpinion::TotalDesignCount = 0; int MotorCar::DesignOpinion::PercentScore() { return AceDesignCount*100/TotalDesignCount; } MotorCar::Wheels::Wheels(Shape shape, size_t count) : shape(shape), count(count) {} MotorCar::WindScreen::WindScreen(bool opaque) : opaque(opaque) {} MotorCar::MotorCar(const std::string &name, const Wheels &wheels, const WindScreen &windscreen) : name(name), wheels(wheels), windscreen(windscreen) {} MotorCar MotorCar::DesignFromComponents(const std::string &name, const Wheels &wheels, const WindScreen &windscreen) { MotorCar car = MotorCar(name, wheels, windscreen); DesignOpinion::TotalDesignCount++; if (car.wheels.Opinion().itrocks && car.windscreen.Opinion().itrocks) DesignOpinion::AceDesignCount++; return car; } MotorCar::DesignOpinion MotorCar::Wheels::Opinion() { DesignOpinion opinion; opinion.itrocks = true; if (shape == Square) { opinion.itrocks = false; opinion.reason = "you'll have a few issues with wheel rotation"; } if (count <= 2) { opinion.reason += opinion.itrocks ? "" : " and "; opinion.itrocks = false; opinion.reason += "a few more wheels are needed for stability"; } if (opinion.itrocks) opinion.reason = "your choice of wheels was top notch"; return opinion; } MotorCar::DesignOpinion MotorCar::WindScreen::Opinion() { DesignOpinion opinion; opinion.itrocks = !opaque; opinion.reason = opinion.itrocks ? "the driver will have a commanding view out the window" : "you can't see out the windscreen"; return opinion; } std::string MotorCar::WillItWork() { DesignOpinion wh = wheels.Opinion(); DesignOpinion ws = windscreen.Opinion(); std::string willit; if (wh.itrocks && ws.itrocks) { willit = "Great car design because " + wh.reason + " and " + ws.reason; } else { willit = "You need a rethink because "; willit += wh.itrocks ? "" : wh.reason; willit += (!wh.itrocks && !ws.itrocks) ? " and " : ""; willit += ws.itrocks ? "" : ws.reason; } return willit; }