%module member_pointer %inline %{ class Shape { public: Shape() { nshapes++; } virtual ~Shape() { nshapes--; }; double x, y; double *z; void move(double dx, double dy); virtual double area(void) = 0; virtual double perimeter(void) = 0; static int nshapes; }; class Circle : public Shape { private: double radius; public: Circle(double r) : radius(r) { }; virtual double area(void); virtual double perimeter(void); }; class Square : public Shape { private: double width; public: Square(double w) : width(w) { }; virtual double area(void); virtual double perimeter(void); }; extern double do_op(Shape *s, double (Shape::*m)(void)); /* Functions that return member pointers */ extern double (Shape::*areapt())(void); extern double (Shape::*perimeterpt())(void); /* Global variables that are member pointers */ extern double (Shape::*areavar)(void); extern double (Shape::*perimetervar)(void); %} %{ # define SWIG_M_PI 3.14159265358979323846 /* Move the shape to a new location */ void Shape::move(double dx, double dy) { x += dx; y += dy; } int Shape::nshapes = 0; double Circle::area(void) { return SWIG_M_PI*radius*radius; } double Circle::perimeter(void) { return 2*SWIG_M_PI*radius; } double Square::area(void) { return width*width; } double Square::perimeter(void) { return 4*width; } double do_op(Shape *s, double (Shape::*m)(void)) { return (s->*m)(); } double (Shape::*areapt())(void) { return &Shape::area; } double (Shape::*perimeterpt())(void) { return &Shape::perimeter; } /* Member pointer variables */ double (Shape::*areavar)(void) = &Shape::area; double (Shape::*perimetervar)(void) = &Shape::perimeter; %} /* Some constants */ %constant double (Shape::*AREAPT)(void) = &Shape::area; %constant double (Shape::*PERIMPT)(void) = &Shape::perimeter; %constant double (Shape::*NULLPT)(void) = 0;