Hello boost python users,

I really like boost python but I stumbled in a problem I don't know how to solve, maybe you have an idea:

I have a class KnowledgeBase that holds an shared_ptr to an KBObject and also a weak_ptr to an KBObject. If I set the shared_ptr with the set_shared_ptr function it works fine, but it doesn't work with the set_weak_ptr function (which takes a shared_ptr as an argument) ...

see the following C++ code, python export code and python test code to see what i mean. I made a simple example which I also tested and it shows the problem I have.

Thank you in advance.
jahn.


// C++ CODE:
-------------------------------------------------------------------------
class KBObject {
public:
        std::string name;
};

class KnowledgeBase {
public:
        boost::shared_ptr<KBObject> obj_shared_ptr;
        boost::weak_ptr<KBObject> obj_weak_ptr;

        void set_weak_ptr(boost::shared_ptr<KBObject> obj_ptr) {
                obj_weak_ptr = boost::weak_ptr<KBObject>(obj_ptr);
        };

        void set_shared_ptr(boost::shared_ptr<KBObject> obj_ptr) {
                obj_shared_ptr = obj_ptr;
        };

        boost::shared_ptr<KBObject> get_shared_ptr() {
                return obj_shared_ptr;
        };

        boost::shared_ptr<KBObject> get_weak_ptr() {
                return obj_weak_ptr.lock();
        };

        void print_weak_ptr() {
                if (boost::shared_ptr<KBObject>
                    obj_ptr = obj_weak_ptr.lock())

                        std::cout << obj_ptr.get()->name << std::endl;
                else
                        std::cout << "NO OBJECT" << std::endl;
        };
        void print_shared_ptr() {
                if (obj_shared_ptr.get()!=0)
                        std::cout << obj_shared_ptr.get()->name
                        << std::endl;
                else
                        std::cout << "NO OBJECT" << std::endl;
        };
};

// PYTHON MODULE EXPORT ----------------------------------------------
BOOST_PYTHON_MODULE(kbpython)
{
    using namespace boost::python;

    class_<KBObject, boost::shared_ptr<KBObject> >("KBObject")
                .def_readwrite("name", &KBObject::name)
        ;

    class_<KnowledgeBase>("KnowledgeBase")
           .def("set_shared_ptr", &KnowledgeBase::set_shared_ptr)
           .def("set_weak_ptr", &KnowledgeBase::set_weak_ptr)
           .def("get_shared_ptr", &KnowledgeBase::get_shared_ptr)
           .def("get_weak_ptr", &KnowledgeBase::get_weak_ptr)
           .def("print_weak_ptr", &KnowledgeBase::print_weak_ptr)
           .def("print_shared_ptr", &KnowledgeBase::print_shared_ptr)
        ;
}


// PYTHON TEST PROGRAM -----------------------------------------------

#!/usr/bin/env python
import kbpython

kb = kbpython.KnowledgeBase()

obj = kbpython.KBObject()
obj.name = "myObject"
kb.set_shared_ptr(obj)
kb.print_shared_ptr()

obj_2 = kb.get_shared_ptr()
obj_2.name = "change_name"
kb.print_shared_ptr()

kb.set_weak_ptr(obj_2)
kb.print_weak_ptr()


------------------------------------------------------------------------


_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to