Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

std::vector for parent and child class

Tags:

c++

stdvector

I need to create a vector that can contain my parent class and sub class data.

This is what i do..

Vehicle is the parent class

Car is the child class

About Car.cpp , it got the following

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

Then at my main.cpp

At my 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);

Here the issues.. how i put my wheelPoint of car into this vector also.

What i want to achieve is a vector that can contain

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)
like image 494
user1777711 Avatar asked Jan 24 '26 09:01

user1777711


2 Answers

Containers of objects suffer from object slicing. You'll need a vector of pointers (preferably smart):

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

to which you can do:

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

Having a vector of objects will cut off all type information that is beyond Vechicle - so, a Car will be turned into a Vehicle, losing all additional information.

like image 111
Luchian Grigore Avatar answered Jan 26 '26 01:01

Luchian Grigore


I had this same problem and I fixed it by first using and then compiling using c++14. 11 will work as well but I wanted to use some of 14's new features so I did that. I hope this helps!

#include <memory>

std::vector<std::unique_ptr<sf::Shape>> _shapes;
like image 40
Nick Kotenberg Avatar answered Jan 26 '26 01:01

Nick Kotenberg



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!