Я пытаюсь написать код для программного обеспечения, которое будет генерировать различные типы «автомобилей» для моделирования. Я хочу дать пользователю возможность выбрать количество объектов «автомобилей» для моделирования, и я думаю, что фабричный метод будет лучшим способом сделать это.
Вот часть кода, с которой у меня возникают проблемы:
typedef map<char *,Factory *> CarFactories;
CarFactories carFactories;
carFactories["Private"] = new privateFactory();
carFactories["Police"] = new policeFactory();
carFactories["Ambulance"] = new ambulanceFactory();
cout << "Self-Driving Cars Simulatator V1.0" << endl;
cout << "Enter number of vehicles in the simulation > " <<endl;
cin >> numCars;
for(int i = 0; i <= numCars; i++){
int numType;
char vehicleType;
//char *ptrVT;
cout << "enter the number vehicle type to add > " << endl;
cout << " 1- Private Vehicle." << endl;
cout << " 2- Police Car." << endl;
cout << " 3- Ambulance." << endl;
cin >> numType;
if (numType == 1)
vehicleType = 'Private';
else if (numType == 2)
vehicleType = 'Police';
else if (numType == 3)
vehicleType = 'Ambulance';
else
cout << "Invalid entry.";
//ptrVT = &vehicleType;CarFactories::const_iterator it=carFactories.find("Police");
if (it!=carFactories.end())
Factory *factory = *it; //error 1
Private *priv = factory->create(); //error 2
Police *pol = factory->create(); //error 3
Ambulance *amb = factory->create(); //error 4
}
при // ошибке 1 я получаю:
ошибка: невозможно преобразовать «const std :: pair» в «Factory *» при инициализации |
при // ошибке 2,3, & 4 я получаю:
ошибка: неверное преобразование из «Автомобиля» в «Частное / Полиция / Скорая помощь *» [-fpermissive]
Вот мои заводы:
class Factory
{
public:
virtual Car *create() = 0;
};class privateFactory : public Factory {
public:
Private *create() { return new Private();}
};class policeFactory : public privateFactory {
public:
Police *create() { return new Police();}
};class ambulanceFactory : public Factory {
public:
Ambulance *create() { return new Ambulance();}
};
Там нет ошибок с заводами.
Скорая помощь и частный являются производными от автомобиля.
Полиция является производной от частных лиц.
Любая помощь будет оценена.
Авто, частные, полицейские классы:
class Car
{
public:
Car();
..setters and getters.
~Car();
protected:
...double, int, chat variables...};class Police : public Private
{
public:
Police();
..setters and getters.
~Police();
protected:
... int variables...;
};
и так далее.
для первой ошибки * он вернет пару в правильном положении в итераторе.
так что вы получите пару, которую вы должны сделать (* это). секунды.
из-за всех других ошибок автомобиль, эмболия и полиция должны быть пригнаны из машины, это не должно быть аккуратно, например, если частное лицо выехало из машины и чем полиция поехала из него, чем все в порядке (у вас все получилось), но ваша проблема в том, что вы выполняем литье без использования static_cast или c cast.
Police* police = static_cast<Police*>(factory->create())
и ваш код не будет работать для других типов, вам нужно будет получить каждый тип, как вы это сделали с полицией.
как указано в этом посте: Не может быть удручен, потому что класс не полиморфен?.
Других решений пока нет …