std::vector для родительского и дочернего классов

Мне нужно создать вектор, который может содержать данные моего родительского класса и подкласса.

Вот что я делаю..

Транспортное средство является родительским классом

Автомобиль — дочерний класс

Насчет Car.cpp получилось следующее

struct Point
{
    int x,y
};

class Car : public Vehicle
{
private:
    Point wheelPoint[4];
    double area;

public:
    void setPoint();
};

void Car::setPoint()
{
    int xData,yData;

    cout << "Please enter X:";
    cin >> xData;

    cout << "Please enter Y:";
    cin >> yData;

    wheelPoint[i].x = xData;
    wheelPoint[i].y = yData;
}

Затем в моем main.cpp

В моем main.cpp

vector<VehicleTwoD> list;
VehicleTwoD *vehicle;
Car *car = new Car;
string vehicleName;

cout << "Please input name of vehicle";
cin >> vehicleName;

vehicle = new Car;
car->setPoint();

list.push_back( Vehicle() );
list.back().setName(vehicleName);

Здесь вопросы ... как я поместил свою колесную точку автомобиля в этот вектор.

Чего я хочу добиться, так это вектора, который может содержать

Vehicle Name: Vehicle Name (private variable at Vehicle - Parent Class)
Wheel Point[0]: Point (X,Y) ( private var at Car - Child Class)
Wheel Point[1]: Point (X,Y) ( private var at Car - Child Class)
Wheel Point[2]: Point (X,Y) ( private var at Car - Child Class)
Wheel Point[3]: Point (X,Y) ( private var at Car - Child Class)

person user1777711    schedule 26.10.2012    source источник
comment
Что такое Vechicle2D? Способ создания вектора, который может содержать как ваш родительский класс, так и ваш дочерний класс, состоит в том, чтобы иметь вектор указателей на ваш родительский класс и использовать виртуальные функции, vector<Vehicle*> в другие слова.   -  person john    schedule 26.10.2012


Ответы (2)


Контейнеры объектов страдают от нарезки объектов. Вам понадобится вектор указателей (желательно умный):

vector<std::unique_ptr<Vechicle>> vehicleVector;

на что вы можете сделать:

vehicleVector.push_back(new Vehicle);
vehicleVector.push_back(new Car);

Наличие вектора объектов отрезает всю информацию о типе, которая находится за пределами Vechicle, поэтому Car будет преобразовано в Vehicle, потеряв всю дополнительную информацию.

person Luchian Grigore    schedule 26.10.2012
comment
ОП, кажется, смущен тем, как работает полиморфизм, основываясь на том, как он делает list.push_back( Vehicle() ); и list.back().setName(vehicleName); вместо car->setName(vehicleName); и list.push_back(car);. - person Geoff Montee; 26.10.2012
comment
у меня действительно не работает .. я пытаюсь отодвинуть новую машину, но, похоже, это не работает - person user1777711; 26.10.2012
comment
@ user1777711 Ну, это потому, что ты делаешь это неправильно. Но без настоящего кода трудно понять почему. - person john; 26.10.2012
comment
@ user1777711 вы изменили объявление вектора? - person Luchian Grigore; 26.10.2012
comment
@ user1777711 ты #include <memory> сделал? - person Luchian Grigore; 26.10.2012

У меня была такая же проблема, и я исправил ее, сначала используя, а затем скомпилировав с помощью С++ 14. 11 тоже будет работать, но я хотел использовать некоторые из новых функций 14, поэтому я так и сделал. Надеюсь, это поможет!

#include <memory>

std::vector<std::unique_ptr<sf::Shape>> _shapes;
person Nick Kotenberg    schedule 27.09.2017