[C++-sig] Wrapping a simple class

Eric Jardim ericjardim at gmail.com
Sat Mar 26 17:33:10 CET 2005


Hi,

I have read the paper of Boost.Python and the tutorial, and started
trying wrapping some handy-made classes to learn how to use
Boost.Python with real APIs.

My question is simple (I think :) ). Suppose I have this class below:

###   a.h   ###
class A {
    A* _parent;
    char* _name;
public:
    A(A* parent=0, const char* name);
    const char* getName() const;
    void setName(const char* name);
    A* getParent() const;
};

###    a.cpp   ###
#include "hello.h"
#include <string.h>

A::A(A* parent, const char* name) {
   _parent = parent;
   setName(name);
}

const char*
A::getName() const {
    return _name;
}

void
A::setName(const char* name) {
    strcpy(_name, name);
}

A*
A::getParent() const {
    return _parent;
}

---

The example is simple enough, besides that some functions deals with
char* and A* pointers. Reading the turorial and paper I've noticed
that the arguments and return values are always ints, bools, doubles
and even std::strings, but never custom objects references/pointers.

I have tried (trivial) examples before (no pointers) and it worked Ok.
But trying this example things do not worked as I expected.

I tried exposing this class with something like:

#include <hello.h>

BOOST_PYTHON_MODULE(hello)
{
    class_<A>("A", init<A*, const char*>())
        .add_property("name", &A::getName, &A::setName)  // readwrite property
        .add_property("parent", &A::getParent) // readonly property
    ;
}

Here is my Python script that uses the wrapper:

###   hello.py   ###
import hello
a = hello.A(None, 'a')
print a, a.name, a.parent
b = hello.A(a, 'b')
print b, b.name, b.parent

---

The expected behaviour is that the "a" object has no parent, so I pass
a None (which I suppose that is converted to 0 in C++), and a "b"
object has "a" as its parent.

The expected output is:
>>> import hello
>>> a = hello.A(None, 'a')
>>> print a, a.name, a.parent
<hello.A object at 0x11111111> a None
>>> b = hello.A(a, 'b')
>>> print b, b.name, b.parent
<hello.A object at 0x22222222> b <hello.A object at 0x11111111>

---

Thanks in advance. I think if I understand this example things will be
much clearer from here on...

[Eric Jardim]



More information about the Cplusplus-sig mailing list