расширение защищенных функций boost::python

У меня есть код 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

но есть ошибка компилятора: *ошибка: ‘ExtraClass MyApp::m_Foo’ защищен*

PS. Если я поменяю защищенный на общедоступный (просто для пробы). Я могу получить доступ к *m_Foo* только в режиме только для чтения:

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

Изменение на *def_readwrite* привело к ошибке компилятора:

/boost#include "ExtraClass.h" ... MyClass::MyClass() { ... protected: bool Func{} ExtraClass m_Foo; ... } 52_0/boost/python/data_members.hpp:64:11: ошибка: нет совпадения для 'operator=' в '(((ExtraClass)c) + ((sizetype)((const boost: :python::detail::member<ExtraClass, MyClass>*)this)->boost::python::detail::member<ExtraClass, MyClass>::m_what)) = d'

Спасибо за любую помощь!


person user1932506    schedule 27.12.2012    source источник
comment
Вы должны предоставить более подробную информацию с примером, который люди действительно могут скомпилировать (чтобы сгенерировать точную ошибку).   -  person Nathan Binkert    schedule 28.12.2012


Ответы (1)


В общем, если вы хотите обернуть защищенные члены, вам нужно получить класс (оболочку) от родителя, который делает члены общедоступными. (Вы можете просто сказать using Base::ProtectedMember в разделе public, чтобы показать его, а не обертывать). Затем вы должны обернуть его нормально. Как это:

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

В этом конкретном примере (который действительно не полностью запечен), если вы хотите получить доступ к m_Foo, вам нужно обернуть ExtraClass. Предполагая, что у вас есть Проблема с чтением и записью, вероятно, связана с реализацией ExtraClass (который, вероятно, не предоставляет оператор =, который вы можете использовать).

person Nathan Binkert    schedule 27.12.2012