我正在用 C++ 構(gòu)建一個(gè)庫,它使用 SWIG 連接到 Python 3 4.0.1。經(jīng)過一段時(shí)間的開發(fā)后,我注意到(我認(rèn)為是所謂的)別名問題。我準(zhǔn)備了一個(gè)最小的例子,這也會(huì)發(fā)生??紤]具有在 處初始化的dummy單個(gè)(私有)屬性的類?,F(xiàn)在,我有這個(gè)非常小的 python 腳本:attr0import dummy_wrapd1 = dummy_wrap.dummy()d2 = d1d1.set_attr(12)print(d2.get_attr()) # this prints '12', not '0'我希望我所說的別名是這里真正發(fā)生的事情:對(duì)象d2從未被修改,但它采用給定的值d1,就好像賦值d2=d1實(shí)際上是指針賦值一樣。我希望發(fā)生的事情(也是我期望發(fā)生的事情)是賦值運(yùn)算符制作passes it ontoa=b的硬拷貝。換句話說,修改不應(yīng)該影響,反之亦然,只要這符合實(shí)現(xiàn)細(xì)節(jié)(就像我的庫和最小示例中的情況一樣)。baab最后一點(diǎn),這是我在編譯時(shí)收到的消息: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問題:我想了解這里發(fā)生了什么以及為什么:和dummy(dummy&&)影響dummy& operator=(dummy&&)SWIG 包裝dummy(const dummy&)和的方式dummy& operator=(const dummy&)嗎?期望我想要的默認(rèn)行為是否合理,即這是(別名)使用 SWIG 連接到 python 后類的預(yù)期行為嗎?我該如何解決這個(gè)問題:我應(yīng)該做哪些更改才能讓操作員=制作硬拷貝?
1 回答

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