From: Marcelo M. <mm...@ac...> - 2006-02-12 19:40:20
|
Sorry again, here, simpler version, we don't need to add the dynamic_cast operation to derived types. Marcelo Charlie Savage wrote: > Thanks Marcelo, > > Very helpful. > Makes me wonder if there could be a more elegant way? Maybe a > template method on the Geometry class, so at least the downcast method > only has to be written once? > > Are there any plans to have SWIG generate this sort of code - at least > the downcast method/s ? > > Thanks, > > Charlie > > > > Marcelo Matus wrote: > >> you need to add the dynamic cast operations for all the Geometry object >> >> %extend Circle { >> static Circle *dcast(Geometry *g) { return dynamic_cast<Circle >> *>(g); } >> } >> >> %extend Point { >> static Point *dcast(Geometry *g) { return dynamic_cast<Point *>(g); } >> } >> >> .... >> >> then use the infamous 'switch' operation, but implemented in Ruby >> (here in pseudo C/Python): >> >> def unpackGeometry(geom_string): >> geom = GeomFactory.new.parseGeometry(geom_string) >> circle = GeomFactory.Circle.dcast(geom) >> if (circle != Qnil) return circle >> point = GeomFactory.Point.dcast(geom) >> if (point != Qnil) return point >> .... >> return Qnil >> >> >> and use it as >> >> obj = unpackGeometry(geom_string) >> >> then 'obj' will be what you expect, ie, a circle, or a point, etc. >> >> And of course, that is assuming Geometry has a virtual >> member/descructor. >> >> class Geometry { >> public: >> virtual ~Geometry() {} >> } >> >> >> Marcelo >> >> >> Charlie Savage wrote: >> >>> Hi everyone, >>> >>> Was wondering what the best way to handle this issue with C++ >>> inheritance (seem like an obvious question, but didn't dig anything >>> up with Google or the mailing list): >>> >>> class GeomFactory { >>> Geometry* parseGeometry(char* geom_serialized_to_string) {} >>> } >>> >>> class Geometry { >>> Geometry() {} >>> } >>> >>> class Point: public Geometry { >>> Point() {} >>> } >>> >>> class Line: public Geometry { >>> Line() {} >>> } >>> >>> Etc...including polygon, multipoint, multipolygon, geometry >>> collection, etc. >>> >>> So from Ruby: >>> >>> geom_string = '<serialized form of geometry>' >>> geom = GeomFactory.new.parseGeometry(geom_string) >>> >>> The class of geom will always be geom, not point, not line, not >>> polygon. Of course, the underlying C++ object is really a point, >>> line, etc. so the wrapper Ruby object is incorrect. >>> How do I get the correct Ruby wrapper object - i.e., a Ruby point >>> for a C++ point, a Ruby line for a C++ line, etc. >>> >>> Charlie >>> >>> >>> >>> >>> >>> >>> >>> >>> Question about C++ inheritance (I'm running into an issue with C++ >>> inheritance and haven't managed to find anWas wondering if >>> any...@li... >> >> >> >> >> |