0

我有 C++ 代码(不是我的,所以它不可编辑)。问题在于扩展受保护的函数和类。

#include "ExtraClass.h"
...
MyClass::MyClass()
{
...
protected:
    bool Func{}
    ExtraClass m_Foo;
...
}

我需要在 Python 中访问 m_Foo 方法和受保护的函数,例如 Func( )

from MyClass import  *
bar = MyClass()
bar.m_Foo.Run() //something like this

但有一个编译器错误:*error: 'ExtraClass MyApp::m_Foo' is protected*

PS。如果我更改为 public 保护(仅供尝试)。我只能在只读模式下访问 *m_Foo*:

class_<MyClass>("MyClass", init<>()) 
    .def_readonly("m_Foo", &MyClass::m_Foo)

更改为 *def_readwrite* 会导致编译器错误:

/boost_1_52_0/boost/python/data_members.hpp:64:11:错误:'<em>中的'operator='不匹配(((ExtraClass)c)+((sizetype)((const boost :: python :: detail::member <ExtraClass, MyClass>*)this)->boost::python::detail::member <ExtraClass, MyClass>::m_which)) = d'</p>

感谢您的任何帮助!

4

1 回答 1

2

通常,如果要包装受保护的成员,则需要从使成员公开的父级派生一个(包装器)类。(您可以简单地说using Base::ProtectedMember在一个public部分中公开它而不是包装它)。然后,您将正常包装它。像这样:

class MyWrapperClass : public MyClass {
  public:
    using MyClass::m_Foo;
};

在这个特殊的例子中(实际上还没有完全出炉),如果你想访问 m_Foo,那么你需要包装 ExtraClass。假设您有 readwrite 的问题可能是 ExtraClass 的实现(它可能不提供您可以使用的 operator=)。

于 2012-12-27T20:39:41.260 回答