2014-02-18 65 views
3

(這是一個問題,我昨天問過,但我簡化它)痛飲:一個自定義的類的對象作爲輸出參數(與Python)

我創建了一個類,我希望兩個對象作爲輸出一個函數的參數(下面稱爲Test)。但是,當我運行swig命令swig -C++ -python swigtest.i時,出現錯誤「Warning 453:Can not apply(MyClass & OUTPUT)。沒有定義類型映射。」我嘗試添加類型映射,但這沒有幫助。我也試過使用指針,指向指針的指針和指針的引用,這也沒有幫助。

我覺得我忽略了一些簡單的東西,因爲這應該是一件很常見的事情。或者我需要編寫一個複雜的類型圖,就像我見過的,但不明白(還)?

下面是我的代碼:

MyClass.h(簡化,使之可以理解的,所以切換到使用INT沒有幫助):

class MyClass 
{ 
    int x; 
public: 
    int get() const 
    { 
     return x; 
    } 
}; 

void Test(MyClass &obj1, MyClass &obj2); 

swigtest.i:

%module swigtest 

%include typemaps.i 

%{ 
#define SWIG_FILE_WITH_INIT 
%} 

%{ 
#include "MyClass.h" 
%} 

%include "MyClass.h" 

%apply (MyClass& OUTPUT) { MyClass &obj1 } 
%apply (MyClass& OUTPUT) { MyClass &obj2 } 
+0

你應該把你的答案放在一個單獨的答案,而不是在你的問題。也只是一個說明,你可以使用「%忽略測試」,以便命名python插入「測試」。 – Schollii

+0

對不起,我新來張貼堆棧溢出。我只是做了你的建議。 –

+0

沒有問題,我們都在這裏學習 – Schollii

回答

0

我定居在增加額外swigtest.i Python代碼封裝了測試功能,讓我可以寫obj1, obj2 = Test2()。我仍然認爲必須有一個簡單的解決方案,

// swigtest.i:

%module swigtest 

%{ 
#define SWIG_FILE_WITH_INIT 
#include "MyClass.h" 
%} 

%include "MyClass.h" 

%insert("python") %{ 
    def Test2(): 
     obj1 = swigtest.MyClass() 
     obj2 = swigtest.MyClass() 
     swigtest.Test(obj1, obj2) 
     return obj1, obj2 
%} 
0

嘗試:

%module swigtest 

%{ 
#define SWIG_FILE_WITH_INIT 
#include "MyClass.h" 
%} 

%include "typemaps.i" 
%apply MyClass *OUTPUT { MyClass &obj1, MyClass &obj2 }; 

%include "MyClass.h" 

你也可以創建一個返回一個std ::名單的包裝:

%include "std_list.i" 
%ignore Test; 
%rename(Test) TestWrap; 
%inline %{ 
    std::list<MyClass> TestWrap() { 
      MyClass obj1, obj2; 
      Test(obj1, obj2); 
      std::list<MyClass> tempList; 
      tempList.push_back(obj1); 
      tempList.push_back(obj2); 
      return tempList; 
    } 
%} 
+0

%的整點敷,這樣我可以做',OBJ 2 =的 OBJ1測試()' 代替 'OBJ1 = MyClass的() OBJ 2 = MyClass的() 測試(obj1,obj2)' 您的解決方案只允許我做後者。 –

+0

我在看你的問題,我沒有看到你在哪裏陳述這個非常重要的信息!你能用這個更新你的問題嗎?我已經編輯了我的答案,也許這次是相關的:) – Schollii

+0

對不起,我認爲使用'%apply MyClass&OUTPUT'會明確表示我想這樣做,我應該更清楚。我試過你的解決方案,但不幸的是我仍然得到相同的錯誤。 –

1

正如我在以前的評論指出,在申請%OUTPUT招只適用於有限的一組POD類型。

對於未來的Swiggers,該解決方案爲我(在C#綁定):

%typemap(cstype) CustomType* "out CustomType" 
%typemap(csin, 
    pre=" $csclassname temp$csinput = new $csclassname();", 
    post=" $csinput = temp$csinput;" 
) CustomType* "$csclassname.getCPtr(temp$csinput)" 

這會產生與CustomType通過指針傳遞一個「出」參數一個公共接口。內部P/Invoke接口(csim)保留爲原始指針。 「csin」類型圖創建一個臨時變量並分配給輸出參數。另外值得注意的是,在C#中,如果MyCustomType已經是一個引用類型,你可能不需要這個,但是奇怪的是有一個API修改參數值而不聲明它是「out」(這實際上適用於我類型,但我更喜歡顯式的參數)。