Re: map and virtual operator< for base class

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Can you implement a comparison operator that compares the multiple class types to each other?

If not, they can't be in the same map. You must be able to compare any object you will put in the map to any object already in the map.

If you can compare them, I wouldn't expect the easiest implementation to involve a virtual operator<(), but if it does involve a virtual operator<(), that isn't a fundamental problem. There are ways around the masking issue I posted about earlier.

I think the more fundamental problem is storing polymorphic objects in a container.

I don't use boost much, and I have no idea what support boost might provide for polymorphic objects in a container.

In my own programming that is a common requirement and I have implemented the underlying support in at least two different ways.

1) With pointer semantics, rather than value semantics, on all objects retrieved from the container. For that it is easiest to use a wrapper class around the pointer that forwards operator<() to the object pointed at. Then have a container of those pointers. When setting that up, there are several choices possible for who owns the objects, whether the objects are cloned when inserted into the container, whether the destruction of the pointer wrapper destroys the object, etc. Depending on use, there is no one correct combination of those choices, but there are many incorrect combinations. Think through the ownership, copy and deletion issues carefully.

2) With value semantics. I've never covered every detail to make this a clean generic container. I've just made it good enough for my own use. The container holds pointers, rather than objects. But the operator[]() on the container and the behavior of the iterator objects returned by many other functions of the container all pretend the container holds objects (by adding the extra level of dereference). Again there are lots of choices (which I did as template parameters) for whether you clone on insertion and whether you delete on removal, whether you count ownership, or assume single ownership or assume external ownership.

C++ obviously has no standard support for clone. Simple copying of a polymorphic object copies only the base class, which is the most fundamental problem in a container of polymorphic objects. I prefer to simply implement the clone() function in any class hierarchy that has use for it. So if one of my containers needs clone() it just calls clone(). If the object has no clone method, that was a mistake in the choice to use that type of container for that type of object.

Bernd Prager wrote:

So the only way basically is then to have a separate map for each class, right? Is there a better way to implement a class cache for multiple class types?




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux