Для обработки создания, я создал ATARCHANTORY , который использует реестр Lambdas, хранящийся в unoronded_map .
Тип транспортного средства (
Код: Выделить всё
CoupeМетод создания фабрики ищет тип автомобиля по имени и вызовет соответствующий создатель, возвращая std :: ulious_ptr
.
Код: Выделить всё
VehicleFactory< /code> input -> std :: string < /code> (тип транспортного средства, например, «купе» "седан" "мотоцикл")
VehicleFactoryПока что хорошо, я думаю. Проблема в том, что не все классы транспортных средств имеют одну и ту же подпись конструктора, некоторые принимают больше параметров, а другие-нет.
Код: Выделить всё
Coupe(unsigned int licensePlateYear, const std::string& brand, fuelType fuel)
: Car(NUMBER_OF_PORTS, licensePlateYear, brand, fuel)
{}
< /code>
Sedan(unsigned int licensePlateYear, const std::string& brand, fuelType fuel)
: Car(NUMBER_OF_PORTS, licensePlateYear, brand, fuel)
{}
< /code>
Motorcycle(unsigned int licensePlateYear, const std::string& brand, fuelType fuel, Fairing hasFairing)
: Vehicle(licensePlateYear, brand, fuel),
m_hasFairing{ hasFairing }
{}
< /code>
Это сказано, я попробовал что-то подобное: < /p>
Заводской класс: < /p>
class VehicleFactory {
private:
using Creator = std::function; /* I mean what about Motorcycle's different parameters? */
using Creators = std::unordered_map;
Creators m_creators;
public:
// Register vehicle creators
void ToolFactory() {
m_creators["Coupe"] = [](unsigned int licensePlateYear, const std::string& brand, fuelType fuel) {
return std::make_unique(licensePlateYear, brand, fuel);
};
m_creators["Sedan"] = [](unsigned int licensePlateYear, const std::string& brand, fuelType fuel) {
return std::make_unique(licensePlateYear, brand, fuel);
};
m_creators["Motorcycle"] = [](unsigned int licensePlateYear, const std::string& brand, fuelType fuel) {
return std::make_unique(licensePlateYear, brand, fuel); /* Error, MotorCycle has diferent constructor parameters! */
};
/* (...) */
}
// Create a vehicle by object string name
std::unique_ptr create(const std::string& name, unsigned int licensePlateYear, const std::string& brand, fuelType fuel) /* This parameters only works for Sedan or Coupe*/ {
auto it = m_creators.find(name);
if (it == m_creators.end()) {
/* throw something here (Runtime Erro... name not found!) */
std::cout second(licensePlateYear, brand, fuel);
}
};
Подробнее здесь: https://stackoverflow.com/questions/797 ... parameters
Мобильная версия