D
Digital Puer
I have several C++ questions:
1. Why are the interfaces for multiset and multimap so complicated for
getting multiple values?
Instead of
multimap<Key, Value>
I usually prefer
map<Key, vector<Value> >
Isn't that much easier to use?
2. Suppose I have a base class that looks like:
class Base
{
public:
virtual void combine(const Base &other, Base &result) = 0;
}
class Derived : public Base
{
private:
string _name;
public:
void combine(const Derived &other, Derived &other) {}
}
When I try to instantiate Derived, g++ is telling me that the
pure virtual method Base.combine() is not implemented.
Why does Derived.combine() above not override Base.combine()?
Instead, I have to do some casting, like:
void combine(const Base &other, Base &result)
{
Derived &a = (Derived &)other;
string combination = _name + a._name;
((Derived &)result)._name = combination;
}
Is there a better approach?
3. For my abstract Base class, I want to specify a static "Factory"
method that produces a Base*:
class Base
{
virtual static Base* createRandomInstance();
}
I want to force all my Derived classes to provide such a factory
method that produces a Derived *.
However, apparently I cannot have a virtual static method
in C++ (or in Java). What is the best way to force that all
derived classes have such a factory method?
1. Why are the interfaces for multiset and multimap so complicated for
getting multiple values?
Instead of
multimap<Key, Value>
I usually prefer
map<Key, vector<Value> >
Isn't that much easier to use?
2. Suppose I have a base class that looks like:
class Base
{
public:
virtual void combine(const Base &other, Base &result) = 0;
}
class Derived : public Base
{
private:
string _name;
public:
void combine(const Derived &other, Derived &other) {}
}
When I try to instantiate Derived, g++ is telling me that the
pure virtual method Base.combine() is not implemented.
Why does Derived.combine() above not override Base.combine()?
Instead, I have to do some casting, like:
void combine(const Base &other, Base &result)
{
Derived &a = (Derived &)other;
string combination = _name + a._name;
((Derived &)result)._name = combination;
}
Is there a better approach?
3. For my abstract Base class, I want to specify a static "Factory"
method that produces a Base*:
class Base
{
virtual static Base* createRandomInstance();
}
I want to force all my Derived classes to provide such a factory
method that produces a Derived *.
However, apparently I cannot have a virtual static method
in C++ (or in Java). What is the best way to force that all
derived classes have such a factory method?