SWIG (Python) - "no constructor defined" for concrete class

S

Stodge

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.

Thanks as always
 
P

Paul Melis

Stodge said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,528
Members
45,000
Latest member
MurrayKeync

Latest Threads

Top