Re: Passing a class to a pure virtual function (without templates)
captaincurk@googlemail.com wrote:
Thanks Stuart!
Your problem description reads very confusing. The method for adding
new items takes no parameters, which is a bit odd. Probably that is
the source of your problem. Try to write a short summary of what
addItems should do, and most probably you'll see your problem.
I'm sorry, while simplifying my example, I of course omitted a few
details. I'll try to clarify:
The addItems function takes a stream as parameter and extracts so-
called "Types" from the stream, all of which are derived from a
TypeBase. Inside class B I maintain a list of TypeBase*, which
contains all ever added Types.
I need to be able to do this:
A* myObj = new B();
B->addItems<Type1>(stream1);
B->addItems<Type1>(stream2);
B->addItems<Type2>(stream1);
Here you go again... The syntax B->addItems is not C++. The type
cannot be on the left side of ->. Perhaps you meant
myObj->addItems ...
?
This is of course impossible, as I need addItems to be virtual,
because myObj must be of type A* (because it is contained in a list of
A*). But in the above example you can see, why I can't make B a
template class, as the user will call addItems with different Types on
the same B object.
I would like to do something like
B->addItems(stream1, (ClassPtr)Type1)
but I don't know if that is somehow possible (I made (ClassPtr) up ;))
It would seem that your 'A' needs to be a template (and it can still be
abstract if it must), and all the storage functionality (addItems et
al.) needs to be moved there. Something like
template<class T> class A {
protected: // if the derived classes are to access it directly
std::list<T> storage;
public:
void addItems(T const& t) { storage.push_back(t); }
virtual void someOtherFunction() = 0; // if you have to
};
class B : public A<MyStreamType> {
...
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask