Ошибка компилятора при использовании фабричного метода: невозможно преобразовать const std :: pair & lt; char * const

Я пытаюсь написать код для программного обеспечения, которое будет генерировать различные типы «автомобилей» для моделирования. Я хочу дать пользователю возможность выбрать количество объектов «автомобилей» для моделирования, и я думаю, что фабричный метод будет лучшим способом сделать это.

Вот часть кода, с которой у меня возникают проблемы:

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...;
};

и так далее.

0

Решение

для первой ошибки * он вернет пару в правильном положении в итераторе.
так что вы получите пару, которую вы должны сделать (* это). секунды.
из-за всех других ошибок автомобиль, эмболия и полиция должны быть пригнаны из машины, это не должно быть аккуратно, например, если частное лицо выехало из машины и чем полиция поехала из него, чем все в порядке (у вас все получилось), но ваша проблема в том, что вы выполняем литье без использования static_cast или c cast.

Police* police = static_cast<Police*>(factory->create())

и ваш код не будет работать для других типов, вам нужно будет получить каждый тип, как вы это сделали с полицией.

как указано в этом посте: Не может быть удручен, потому что класс не полиморфен?.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector