In my code, I have a set of objects:
class Sphere { ...
class Plane { ...
...
And I need to use a collection of them (they will all have different types) in a vector
. How would I add objects of different classes to a vector
?
In my code, I have a set of objects:
class Sphere { ...
class Plane { ...
...
And I need to use a collection of them (they will all have different types) in a vector
. How would I add objects of different classes to a vector
?
or
and if you want to delete the pointers
Since the vector stores instances of Shape and Sphere/Plane are derived of the base class Shape, C++ will allow this to work
The other posts have told you most of what you need to know. I would like to add that boost has pointer containers that might be handy as they cleanup there contents when they are destroyed. Boost manual
The classes would need to have a common base class, e.g.:
Then in order to store polymorphic objects in a vector, you must store a pointer to them (because they can be different sizes from the base class). I recommend using a
std::shared_ptr<MyBase>
orstd::unique_ptr<MyBase>
(or use Boost if C++0x isn't available).If there is no common base, you'd have to use
void*
, or find a different way to do this.Creating containers of polymorphic types is a classical solutions, which comes with its own problems. One of which the types have to become polymorphic just in order to add them to a container -- not a good reason. Another problem is early and tight coupling resulting in more difficult maintenance and lack of flexibility, just in order to add them to a container -- not a good reason. Fortunately, in C++ there are better alternatives.
A better solution would be storing functions and not objects themselves in containers. The common reason why you want to put different types in the same container is to perform the same actions on all of them, for example,
Sphere::Draw()
orPlane::Draw()
. What you can do is create a container of draw functions instead and erase type. E.g.By doing that you avoided strong coupling and other problems of inheritance, and got a more flexible, more general solution.
The above solution works only with C++11 as it requires std::function()
Are the objects related in a meanginful way? If they're not, then you probably shouldn't.
If they are, you'll want to do some reading on inheritance.
Sphere and Plane would need a common base type, or your vector would need to be composed of
void*
's.Common base type (better):
or
void*
's (not great):