Re: Dynamically choosing what to "new"
On Jun 9, 12:22 pm, Pat <n...@none.none> wrote:
I've run into a strange problem, but one that seems like it might be
fairly common.
I have a single base class, from which several other classes are derived.
To keep the example simple, the base class is "Animal" and the derived
classes are "Cat," "Dog," and "Horse."
The base class has a pure virtual method:
virtual void GetName(std::string *s) = 0;
All the derived classes are required to implement this method and return
the appropriate string, for example:
void Dog::GetName(std::string *s)
{
*s = "Dog";
}
Not related to your problem, but is there any reason for passing
a poniter to a string, and not simply returning a string.
So when the user clicks a "Save" button, a text file is written by
calling the GetName() method on all the existing Animal objects. So the
file on disk would look something like this:
Dog, Cat, Dog, Dog, Horse, Cat
Later, when the user clicks a "Load" button, I'd like to recreate all
those animals. What's a clean way to do this?
The usual situation is some sort of registry with either
pointers to functions, or pointers to an abstract Factory
object. Using the abstract factory object method, this might
look like:
class Factory
{
public:
virtual ~Factory() {}
virtual Animal* create() const = 0 ;
protected:
explicit Factory( std::string const& name ) ;
} ;
typedef std::map< std::string, Factory const* >
FactoryMap ;
FactoryMap factoryMap ;
Factory::Factory(
std::string const& name )
{
FactoryMap::iterator
elem = factoryMap.find( name ) ;
assert( elem == factoryMap.end() ) ;
factoryMap.insert( FactoryMap::value_type( name, this ) ) ;
}
template< typename T >
class ConcreteFactory : public Factory
{
public:
explicit ConcreteFactory( std::string const& name )
: Factory( name )
{
}
virtual Animal* create() const
{
return new T ;
}
} ;
Given that, you just declare a static instance of a factory for
each type you're interested in. (Watch out for order of
initialization issues, though. In practice, I usually make the
map a singleton.)
--
James Kanze (Gabi Software) email: james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34