Заводский подход для построения объектов с разными параметрамиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Заводский подход для построения объектов с разными параметрами

Сообщение Anonymous »

Я работаю над фабричным классом, чтобы создать различные объекты. Исходя из этого, я получаю класс Car и от Car я получаю купе и седан . У меня также есть класс мотоцикла , который вытекает непосредственно из транспортного средства .
Для обработки создания, я создал ATARCHANTORY , который использует реестр Lambdas, хранящийся в unoronded_map .
Тип транспортного средства (, седан , Motorcycle ) зарегистрирован в функции создателя, которая знает, как построить правильный объект (см. Код ниже).
Метод создания фабрики ищет тип автомобиля по имени и вызовет соответствующий создатель, возвращая std :: ulious_ptr
.

Код: Выделить всё

VehicleFactory< /code> input -> std :: string < /code> (тип транспортного средства, например, «купе» "седан" "мотоцикл")

VehicleFactory
output -> std :: unique_ptr
Пока что хорошо, я думаю. Проблема в том, что не все классы транспортных средств имеют одну и ту же подпись конструктора, некоторые принимают больше параметров, а другие-нет.

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»