[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