SWIG (Python) - "no constructor defined" for concrete class
Paul Melis
paul at science.uva.nl
Mon Apr 21 07:30:19 EDT 2008
Stodge wrote:
> Yet another SWIG question (YASQ!).
>
> I'm having a problem with using an abstract base class. When
> generating the Python bindings, SWIG thinks that all the concrete
> classes that derive from this abstract class are abstract too and
> won't create the correct constructor.
>
> Abstract class:
>
> [source lang="cpp"]class CORE_API Shape
> {
> public:
> virtual ~Shape()
> {
> nshapes--;
> };
> double x, y;
> virtual void move(double dx, double dy);
> virtual double area(void) = 0;
> virtual double perimeter(void) = 0;
> static int nshapes;
> protected:
> Shape() {
> nshapes++;
> }
>
> };
> [/source]
>
> Derived classes:
>
> [source lang="cpp"]class CORE_API Circle : public Shape
> {
> private:
> double radius;
> public:
> Circle(double r): Shape(), radius(r)
> {
> };
> virtual double area(void);
> virtual double perimeter(void);
> };
>
> class CORE_API Square : public Shape
> {
> private:
> double width;
> public:
> Square(double r): Shape(), width(r)
> {
> };
> virtual double area(void);
> virtual double perimeter(void);
> };
> [/source]
>
> SWIG file:
>
> [source lang="cpp"]class Shape
> {
> virtual void move(double dx, double dy);
> virtual double area(void) = 0;
> virtual double perimeter(void) = 0;
> };
>
> class Circle: public Shape
> {
> Circle(double r);
> virtual double area(void);
> virtual double perimeter(void);
> };
>
>
> class Square: public Shape
> {
> Square(double r);
> virtual double area(void);
> virtual double perimeter(void);
> };
> [/source]
>
> C++ COde:
>
> [source lang="cpp"] Circle c(1.02);
> std::cout << "(c++)\t\tCircle\t" << c.area() << std::endl;
> Square s(9.20);
> std::cout << "(c++)\t\tSquare\t" << s.area() << std::endl;
>
> [/source]
>
> For some reason SWIG thinks that Circle and Square are abstract. Any
> ideas why? I'm rather confused by this.
See section 6.6.2 of the SWIG documentation (SWIG and C++ -> Default
constructors, copy constructors and implicit destructors).
Your abstract base class defines its default constructor in the
protected section. From the docs:
"Default constructors and implicit destructors are not created if any
base class defines a non-public default constructor or destructor."
Paul
More information about the Python-list
mailing list