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

しかし、コンパイラエラーがあります:*エラー:'ExtraClass MyApp::m_Foo'は保護されています*

PS。私がパブリックで保護されているように変更した場合(試してみるためだけに)。* 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>(((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をラップする必要があります。読み取り/書き込みの問題は、ExtraClassの実装である可能性があります(おそらく、使用できる演算子=を提供していません)。

于 2012-12-27T20:39:41.260 に答える