From: Charlie S. <cf...@in...> - 2006-02-12 09:32:20
|
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... > > > > |