2012-12-27 85 views
0

我有C++代碼(不是我的,所以它是不可編輯的)。問題是擴展受保護的功能和類。擴展保護功能boost :: python

#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: error: no match for ‘operator=’ in ‘(((ExtraClass)c) + ((sizetype)((const boost::python::detail::member <ExtraClass, MyClass >*)this)->boost::python::detail::member <ExtraClass, MyClass >::m_which)) = d’

感謝您的幫助!

+0

你應該提供更多的細節,例如人們可以真正編譯(以便產生準確的錯誤)。 –

回答

2

一般來說,如果你想包裝受保護的成員,那麼你需要從父類派生一個(包裝)類,使成員公開。 (您可以在public部分簡單地說using Base::ProtectedMember以顯示它,而不是包裝它)。你將會正常包裝它。就像這樣:

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

在這個特殊的例子(這是真的不完全成熟),如果你想訪問m_Foo,那麼你需要用ExtraClass。假設你有讀寫的問題很可能是ExtraClass的實現(它可能不提供可以使用的operator =)。