将C++类实例传递到C++类上增强.pythonC++

2024-09-29 20:20:59 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我实际上是在一个Boost Python库中使用C++类,它是C++类的一个属性。我想在python中这样绑定这两个类:

import ClassParameter
t = ClassParameter.Slave("hi")
a = ClassParameter.Master()
a.setSlave(t)

然后我想使用主类中的一些方法,这些方法使用从类的一个实例:a.setSlave(t) 问题是,当我绑定Slave时,Master只得到实例的一个副本。我不知道怎么才能把两者联系起来。 这是我的增强代码:

#include <boost/python.hpp>
#include "Master.h"
#include "Slave.h"
BOOST_PYTHON_MODULE(ClassParameter)
{
    using namespace boost::python;
    class_<Slave>("Slave")
    .def(init<>())
    .def(init<std::string>())
    .def("getMessage", &Slave::getMessage)
    .def("setMessage", &Slave::setMessage);

    class_<Master>("Master")
    .def(init<>())
    .def(init<Slave>())
    .def("showMessage",&Master::showMessage)
    .def("setSlave",&Master::setSlave)
    .def("getSlave",&Master::getSlave);
}

这是我班的奴隶:

#ifndef _SLAVE_H_
#define _SLAVE_H_
#include <iostream>
class Slave
{
public:
    Slave(std::string message);
    Slave();
    Slave(const Slave& s1 );
    std::string getMessage(void) ;
    void setMessage(std::string message);
private:
    std::string m_message;
};

#endif //_SLAVE_H_


Slave::Slave(){
    m_message = "no message";
}

Slave::Slave(std::string message){
    m_message = message;
}


Slave::Slave(const Slave& s1 ){
    m_message = s1.m_message;
}

 std::string  Slave::getMessage(void)  {
    return m_message;
}

void Slave::setMessage(std::string message){
    m_message = message;
}

这是我的主修课:

#ifndef _MASTER_H_
#define _MASTER_H_
#include "Slave.h"
#include <iostream>
class Master
{
public:

    Master();
    Master(Slave s) : m_slave(&s) {}
    void showMessage();
    void setSlave(Slave s);
    Slave getSlave();


private:

    Slave *m_slave;


};
#endif //_MASTER_H_
#include "Master.h"

Master::Master(){
    m_slave =0;
}

void Master::showMessage(){

    if (m_slave!=0) std::cout<< ( m_slave->getMessage() )<<std::endl;
}

void Master::setSlave(Slave s){
    m_slave = &s;
}

Slave Master::getSlave(){
    return *m_slave;
}

当我使用来自主机的showMessage时,错误消息是:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    a.showMessage()
RuntimeError: basic_string::_M_construct null not valid

我想这是因为setSlave有一个临时副本,但我不知道其他方法来解决这个问题。你知道吗


Tags: mastermessagestringincludeinitdefslaveclass

热门问题