سؤال

ومحاولة لاقامة تبعية في C ++ مع وجود علاقة بين الوالدين والطفل. يحتوي على والد الطفل والطفل لديه مؤشر ضعف إلى الأصل.

وأود أيضا أن تكون قادرة على مستمدة من الأصل في بيثون. ومع ذلك، عندما أفعل هذا، وأحصل على خطأ مؤشر ضعف ربط تصل هذه العلاقة بين الوالدين والطفل.

وكود C ++:

#include <boost/python.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

using namespace boost;
using namespace boost::python;

struct Child;

struct Parent : public enable_shared_from_this<Parent>
{
    void initialize();
    shared_ptr<Child> m_child;
};

struct Child: public enable_shared_from_this<Child>
{
    void setParent(shared_ptr<Parent> ptr);
    weak_ptr<Parent> m_parent;
};

void Parent::initialize()
{
    shared_ptr<Child> ptr(new Child);
    m_child = ptr;

    m_child->setParent(shared_from_this());
}

void Child::setParent(shared_ptr<Parent> ptr)
{
    m_parent = ptr;
}

static PyObject* create(PyObject* object)
{
    PyObject* instance = PyObject_CallObject(object, NULL);

    Parent* parent = extract<Parent*>(instance);
    parent->initialize();

    return instance;
}

وبيثون ملزم:

BOOST_PYTHON_MODULE(test_module)
{
    class_<Parent>("Parent");

    def("create", &create);
} 

وكود بايثون:

from test_module import *

class Test(Parent):
    def __init__(self):
        Parent.__init__(self)

n = create(Test)

خطأ:

Traceback (most recent call last):
  File "main.py", line 8, in <module>
    n = create(Test)
RuntimeError: tr1::bad_weak_ptr

إذا وأنا أحاول تحويل مؤشر استخراج إلى الوالد إلى shared_ptr، وأحصل على حر () خطأ مؤشر غير صالح في بيثون.

هل هناك سبيلا للخروج من هذه المشكلة أو ينبغي أن تتخلى عن استخدام مؤشرات ضعيفة مع بيثون دفعة؟

هل كانت مفيدة؟

المحلول

ولقد لعبت مع رمز من دون الاشياء الثعبان.

وتتكرر هذه المشكلة:

Parent* p(new Parent);
p->initialize();

والمشكلة هي لا شيء على عقد لالكائن shared_ptr. هذا يصلح له:

boost::shared_ptr<Parent> p(new Parent);
p->initialize();

وBoost.Python التعليمات: "عندما يتم تحويل shared_ptr من بيثون، وshared_ptr يدير في الواقع إشارة إلى كائن بيثون تحتوي عندما يتم تحويل shared_ptr إلى بيثون، يتحقق مكتبة لمعرفة ما اذا كان واحد من تلك" بيثون مدراء وجوه "وإذا كان الأمر كذلك يعود فقط الكائن بيثون الأصلي"

والوالد * يجب أن تكون مخزنة في shared_ptr بطريقة أو بأخرى. أنا لم ترد على كيفية حتى الان.

Parent* parent = boost::python::extract<Parent*>(instance);

نصائح أخرى

واجهة من class_ يسمح لك التحكم في كيفية عقد الكائن. وهي معلمة قالب يسمى HeldType. هناك مزيد من المعلومات في وثائق Boost.Python على class_، ولكن بيثون الخاص ملزمة قد تبدو أكثر مثل هذا:

class_<Parent, boost::shared_ptr<Parent> >("Parent");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top