Home

Since I started with OO I've been told switching on typeid is a big
no-no. E.g.

void Washer::wash( Vehicle myVehicle )
{
if( typeid(myVehicle) == typeid(Car) )
Washer::washCar( myVehicle );
else if( typeid(myVehicle) == typeid(Bike)
Washer::washBike( myVehicle );
else if( typeid(myVehicle) == typeid(Boat)
Washer::washBoat( myVehicle );
}

The alternative is the more correct Double Dispatch. E.g.

void Washer::wash( Vehicle myVehicle )
{
myVehicle.washer( this )
}

void Car::washer( Washer w )
{
w.washCar( this );
}

Now, consider we change Washer to XMLConverter and wash() to write().
This will still work, but when we want to go backwards and read XML and
write a Vehicle we need to switch on some kind of type id label anyway. E.g.

Vehicle XMLConverter::readVehicle( XMLdoc doc )
{
Vehicle v;
string s = doc.readAttr();
if( s == "Car" )
v = new Car();
else if( s == "Bike" )
v = new Bike();
else if( s == "Boat" )
v = new Boat();

return v;
}

So why not just give every MyObject a typeName() method and switch or
std::map<char*, fncPtr> on that throughout all dispatchers?


//Daniel

previous
next

Re: Reading from a changing file?
Re: assignment operator
Re: A question on plugin design
Re: shared memory pointer
Re: c++ and target environment
Krwinka
Nasze Dzieci
Kidprotect
Fundacja Sloneczko
Mam Marzenie