Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost.python公开成员的成员_C++_Boost Python - Fatal编程技术网

C++ boost.python公开成员的成员

C++ boost.python公开成员的成员,c++,boost-python,C++,Boost Python,我有以下(简化)代码: 我想公开B::A::intVal,但以下操作不起作用: class_<B>("someClass") .def_readonly("var", &B::A::intVar) ; class_uuquo;someClass”) .def_只读(“var”,&B::A::intVar) ; 我该怎么做呢?我假设您以某种方式填写了B::someObj,或者访问一个潜在的随机指针会使代码崩溃。在这种情况下,必须同时公开A和B才能通过B访问A

我有以下(简化)代码:

我想公开
B::A::intVal
,但以下操作不起作用:

class_<B>("someClass")
    .def_readonly("var", &B::A::intVar)
    ;
class_uuquo;someClass”)
.def_只读(“var”,&B::A::intVar)
;

我该怎么做呢?

我假设您以某种方式填写了
B::someObj
,或者访问一个潜在的随机指针会使代码崩溃。在这种情况下,必须同时公开A和B才能通过B访问A。我测试了以下代码,它按照预期编译和工作:

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

struct A
{
  int intVal;
  char charVal;
};

struct B
{
  A* someObj;
};

static boost::shared_ptr<B> create_b() {
  boost::shared_ptr<B> retval(new B);
  retval->someObj = new A; //<< WARNING: leakage ahead
  retval->someObj->intVal = 3;
  retval->someObj->charVal = 'a';
  return retval;
}

BOOST_PYTHON_MODULE(test)
{
  using namespace boost::python;

  class_<A, A* >("A")
    .def_readonly("intVal", &A::intVal)
    .def_readonly("charVal", &A::charVal)
    ;

  class_<B, boost::shared_ptr<B> >("B")
    .def("__init__", make_constructor(&create_b))
    .def_readonly("someObj", &B::someObj)
    ;
}
在linux下,您可以像这样编译和测试此模块:

$ g++ -I/usr/include/python2.7 -shared -fpic test.cc -lboost_python -lpython2.7 -o test.so
运行Python并检查代码是否正常工作:

>>> import test
>>> b = test.B()
>>> b.someObj.intVal
3
>>> b.someObj.charVal
'a'

我假设您以某种方式填写了
B::someObj
,或者访问一个潜在的随机指针会使代码崩溃。在这种情况下,必须同时公开A和B才能通过B访问A。我测试了以下代码,它按照预期编译和工作:

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

struct A
{
  int intVal;
  char charVal;
};

struct B
{
  A* someObj;
};

static boost::shared_ptr<B> create_b() {
  boost::shared_ptr<B> retval(new B);
  retval->someObj = new A; //<< WARNING: leakage ahead
  retval->someObj->intVal = 3;
  retval->someObj->charVal = 'a';
  return retval;
}

BOOST_PYTHON_MODULE(test)
{
  using namespace boost::python;

  class_<A, A* >("A")
    .def_readonly("intVal", &A::intVal)
    .def_readonly("charVal", &A::charVal)
    ;

  class_<B, boost::shared_ptr<B> >("B")
    .def("__init__", make_constructor(&create_b))
    .def_readonly("someObj", &B::someObj)
    ;
}
在linux下,您可以像这样编译和测试此模块:

$ g++ -I/usr/include/python2.7 -shared -fpic test.cc -lboost_python -lpython2.7 -o test.so
运行Python并检查代码是否正常工作:

>>> import test
>>> b = test.B()
>>> b.someObj.intVal
3
>>> b.someObj.charVal
'a'

B::A::intVar
不起作用,因为它是一个格式错误的限定id。我选择将问题分为两部分:限定id和在Boost.Python中公开成员的成员


下面的代码将两个结构引入到同一命名空间中。因此,
B::A
的限定id不存在,因为
B
不会将
A
重新引入为嵌套标识符:

struct A
{
  int intVal;
  char charVal;
};

struct B
{
  A* someObj;
};
要在
B
中引入
A
标识符,
B
需要:

  • 包含
    A
    结构的定义。(即,
    A
    成为嵌套结构)

  • a
    提供一个typedef

    struct A
    {
      int intVal;
      char charVal;
    };
    
    struct B
    {
      typedef ::A A; // introduces B::A
      A* someObj;
    };
    

为了直接公开成员的成员,Boost.Python需要一个简单的助手函数,例如:

/// @brief Helper function that returns B.someObj.intVal.
int get_b_intval(const B& self)
{
  return self.someObj->intVal;
}
helper函数可以作为Python
B::var
readonly属性公开

namespace python = boost::python;
python::class_<B>("someClass")
  .add_property("var", &get_b_intval)
  ;
namespace python=boost::python;
python::类(someClass)
.add_属性(“var”和get_b_intval)
;

下面是一个完整的示例:

#include <boost/python.hpp>

struct A
{
  int intVal;
  char charVal;
};

struct B
{
  A* someObj;
};


/// @brief Helper function that returns B.someObj.intVal.
int get_b_intval(const B& self)
{
  return self.someObj->intVal;
}

/// @brief Helper function to create a B object.
B make_B()
{
  static A a;
  a.intVal = 42;
  B b;
  b.someObj = &a;
  return b;
}

BOOST_PYTHON_MODULE(example)
{
  namespace python = boost::python;
  python::class_<B>("someClass")
    .add_property("var", &get_b_intval)
    ;

  python::def("make_B", &make_B);
}
#包括
结构A
{
int intVal;
查尔瓦尔;
};
结构B
{
A*someObj;
};
///@brief Helper函数,返回B.someObj.intVal。
int get_b_intval(常数b&self)
{
返回self.someObj->intVal;
}
///@brief Helper函数创建一个B对象。
B make_B()
{
静态A;
a、 intVal=42;
B B;
b、 someObj=&a;
返回b;
}
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::类(someClass)
.add_属性(“var”和get_b_intval)
;
python::def(“make_B”、&make_B);
}
及其用法:

>>导入示例
>>>b=示例。make_b()
>>>打印b.var
42
>>>b.var=0
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:无法设置属性

B::A::intVar
不起作用,因为它是一个格式错误的限定id。我选择将问题分为两部分:限定id和在Boost.Python中公开成员的成员


下面的代码将两个结构引入到同一命名空间中。因此,
B::A
的限定id不存在,因为
B
不会将
A
重新引入为嵌套标识符:

struct A
{
  int intVal;
  char charVal;
};

struct B
{
  A* someObj;
};
要在
B
中引入
A
标识符,
B
需要:

  • 包含
    A
    结构的定义。(即,
    A
    成为嵌套结构)

  • a
    提供一个typedef

    struct A
    {
      int intVal;
      char charVal;
    };
    
    struct B
    {
      typedef ::A A; // introduces B::A
      A* someObj;
    };
    

为了直接公开成员的成员,Boost.Python需要一个简单的助手函数,例如:

/// @brief Helper function that returns B.someObj.intVal.
int get_b_intval(const B& self)
{
  return self.someObj->intVal;
}
helper函数可以作为Python
B::var
readonly属性公开

namespace python = boost::python;
python::class_<B>("someClass")
  .add_property("var", &get_b_intval)
  ;
namespace python=boost::python;
python::类(someClass)
.add_属性(“var”和get_b_intval)
;

下面是一个完整的示例:

#include <boost/python.hpp>

struct A
{
  int intVal;
  char charVal;
};

struct B
{
  A* someObj;
};


/// @brief Helper function that returns B.someObj.intVal.
int get_b_intval(const B& self)
{
  return self.someObj->intVal;
}

/// @brief Helper function to create a B object.
B make_B()
{
  static A a;
  a.intVal = 42;
  B b;
  b.someObj = &a;
  return b;
}

BOOST_PYTHON_MODULE(example)
{
  namespace python = boost::python;
  python::class_<B>("someClass")
    .add_property("var", &get_b_intval)
    ;

  python::def("make_B", &make_B);
}
#包括
结构A
{
int intVal;
查尔瓦尔;
};
结构B
{
A*someObj;
};
///@brief Helper函数,返回B.someObj.intVal。
int get_b_intval(常数b&self)
{
返回self.someObj->intVal;
}
///@brief Helper函数创建一个B对象。
B make_B()
{
静态A;
a、 intVal=42;
B B;
b、 someObj=&a;
返回b;
}
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::类(someClass)
.add_属性(“var”和get_b_intval)
;
python::def(“make_B”、&make_B);
}
及其用法:

>>导入示例
>>>b=示例。make_b()
>>>打印b.var
42
>>>b.var=0
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:无法设置属性

我有时间正确地完成下面的答案。我似乎在两方面都像预期的那样工作。我有时间正确地完成下面的答案。我似乎在两个方面都按预期工作。