[C++-sig] boost python and weak_ptr from a shared_ptr argument
Jahn Fuchs
jfuchs at esigma-technology.com
Wed Nov 25 17:16:58 CET 2009
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()
------------------------------------------------------------------------
More information about the Cplusplus-sig
mailing list