我正在用 C++ 構建一個庫,它使用 SWIG 連接到 Python 3 4.0.1。經過一段時間的開發后,我注意到(我認為是所謂的)別名問題。我準備了一個最小的例子,這也會發生??紤]具有在 處初始化的dummy單個(私有)屬性的類?,F在,我有這個非常小的 python 腳本:attr0import dummy_wrapd1 = dummy_wrap.dummy()d2 = d1d1.set_attr(12)print(d2.get_attr()) # this prints '12', not '0'我希望我所說的別名是這里真正發生的事情:對象d2從未被修改,但它采用給定的值d1,就好像賦值d2=d1實際上是指針賦值一樣。我希望發生的事情(也是我期望發生的事情)是賦值運算符制作passes it ontoa=b的硬拷貝。換句話說,修改不應該影響,反之亦然,只要這符合實現細節(就像我的庫和最小示例中的情況一樣)。baab最后一點,這是我在編譯時收到的消息:g++ -fPIC -c dummy.cppg++ -fPIC -shared -o libdummy_lib.so dummy.oswig -Wall -c++ -python -py3 -o dummy_wrap.cxx dummy_wrap.idummy.hpp:10: Warning 362: operator= ignoreddummy.hpp:11: Warning 362: operator= ignoreddummy.hpp:7: Warning 509: Overloaded method dummy::dummy(dummy &&) effectively ignored,dummy.hpp:6: Warning 509: as it is shadowed by dummy::dummy(dummy const &).g++ -fPIC -c dummy_wrap.cxx -I /usr/include/python3.8g++ -fPIC -shared -o _dummy_wrap.so dummy_wrap.o -L . -ldummy_lib -lpython3.8問題:我想了解這里發生了什么以及為什么:和dummy(dummy&&)影響dummy& operator=(dummy&&)SWIG 包裝dummy(const dummy&)和的方式dummy& operator=(const dummy&)嗎?期望我想要的默認行為是否合理,即這是(別名)使用 SWIG 連接到 python 后類的預期行為嗎?我該如何解決這個問題:我應該做哪些更改才能讓操作員=制作硬拷貝?
1 回答

臨摹微笑
TA貢獻1982條經驗 獲得超2個贊
因此,感謝原帖中的一些評論,一個可能的解決方案是添加一個clone()方法??梢酝ㄟ^簡單地擴展 C++ 標頭來做到這一點。但是,由于這對某些人來說可能看起來很奇怪,因為在許多情況下clone()根本不需要 C++ 中的方法,因此我們可以使用 SWIG 擴展 python 類。只需以dummy_wrap.i示例中的 并在文件末尾添加以下代碼
%extend dummy {
dummy clone() const {
return *$self;
}
}
不幸的是,這還沒有結束,因為我們的 python 代碼必須修改:
import dummy_wrap
d1 = dummy_wrap.dummy()
d2 = d1.clone()
d1.set_attr(12)
print(d2.get_attr()) # now this prints '0'
添加回答
舉報
0/150
提交
取消