boost python:初始化期望来自python的指针的C ++类

时间:2018-04-09 14:06:42

标签: python c++ pointers boost

我有一个主要的C ++类Test,其中的成员元素会被其他C ++类连续更改。这些其他类在构造函数中接收指向Test类的指针,它们应该作为成员保留。重要的是,这是一个指针,并且所有其他类都更改相同的Test对象。简化版本如下所示:

test.h

#ifndef TEST_H
#define TEST_H
class Test {
public:
    int a;
    Test();
    Test * get_ptr(void);
    int geta(void);
};
#endif // TEST_H

TEST.CPP

#include "test.h"
Test::Test() {this->a = 4;};    
Test * Test::get_ptr(void) {return new Test;};    
int Test::geta(void) {return a;};

changer.h

#ifndef CHANGER_H
#define CHANGER_H
#include "test.h"
class Changer {
public:
    Test * t_p;
    Changer(Test * t_ptr);
    void plus1(void);
};    
#endif // CHANGER_H

changer.cpp

#include "changer.h"
Changer::Changer(Test * t_ptr) {t_p = t_ptr;};
void Changer::plus1(void) {t_p->a += 1;};

boost.cpp

#include "test.h"
#include "changer.h"
#include "boost/python.hpp"    
using namespace boost::python;    
BOOST_PYTHON_MODULE(pnt) {
    class_<Test>("Test")
        .def("get_ptr", &Test::get_ptr, return_value_policy<manage_new_object>())
        .def("geta", &Test::geta)
        ;    
    class_<Changer>("Changer", init<Test*>())
        .def("plus1", &Changer::plus1)
        ;
}

这编译很好,但是当我在python中使用它时,我得到了这段代码的分段错误:

In [1]: import pnt
   ...: t = pnt.Test()
   ...: t.geta()
   ...: c = pnt.Changer(t.get_ptr())
   ...: c.plus1()
   ...: t.geta()
   ...: 
Out[1]: free(): invalid pointer
Aborted (core dumped)

我从https://wiki.python.org/moin/boost.python/PointersAndSmartPointers得到了指针的部分,但我似乎无法让它工作。我非常感谢有关如何做到这一点的一些提示。

0 个答案:

没有答案