Passing Vectors of Object Pointers in C++

Learning to use vectors in c++ is fairly straight forward. But passing the collection to a function and returning an instance is not demonstrated as often.

The following code snippet should show a nice complete flow in one shot. Take a look:

#include <iostream>
#include <vector>
 
using namespace std;
 
class Planet {
    public:
        int id;
        Planet(int num){
            id = num;
        }
};
 
class PlanetScanner {
    public:
        Planet* SelectPlanet(vector<Planet*> p){
            return p.at(1);
        }
};
 
int main(){
 
    Planet *mars = new Planet(1);
    Planet *earth = new Planet(2);
    Planet *venus = new Planet(3);
 
    vector<Planet*> planets;
 
    planets.push_back(mars);
    planets.push_back(earth);
    planets.push_back(venus);
 
    PlanetScanner *scanner = new PlanetScanner();
 
    Planet *selectedPlanet = scanner->SelectPlanet(planets);
    cout << "ID: " << selectedPlanet->id;
 
    return 1;
}

Everything above: the classes, the functions and everything is in one file. Structure really isn't the point here.

Start by including the vector library and ensuring the namespace of std is used. That way we can write vector instead of std::vector, but either is fine.

Next, a simple Planet class that simply holds an id variable and can be set with the class constructor. The class itself isn't that important.

Going to skip the SelectPlanet function in the PlanetScanner class for a second and talk about the main function.

In main, three Planet pointers are created with Planet instances.

Next, a vector containing Planet* pointers is created rather than a vector containing Planet instances.

Each of the three Planet pointers is pushed into the vector.

Now we can talk about the SelectPlanet function in the PlanetScanner class. I have created the class to handle the processing and returning of a planet simply to make the scope of returning an object safe.

The SelectPlanet function accepts a vector of Planet* pointers. It also returns a single Planet* pointer as opposed to returning a Planet instance.

The Planet pointer from index 1 of the vector is returned to the caller in main.

A new instance of Planet* is declared and address of the returned pointer is used.

And finally to demonstrate use, the id variable from the planet instance is printed.