2016-11-18 73 views
0

我是C++/cli的新手,我面臨的情況是: 我正在做的項目需要使用外部dll,在我的函數I需要使用類A,B和C都是從這個dll,我把它們放在我的.h文件,.h文件看起來像:從[class name]到[class name]沒有合適的轉換函數*

#include library I use 
    public ref class MyClass 
    { 
    public: 
      MyClass(); 
      ~MyClass(); 
      otherfuc(); 
    private: 
      A *a; 
      B *b; 
      C *c; 
    } 

我.cpp文件看起來像:

MyClass::MyClass() 
{ 
    a = new A(); 
    b = new B(*a); 
    c = b->func(); //error happened 
} 
MyClass::otherfunc() 
{ 
    c->func_c() 
} 

A,B,C類是非託管類,所以我只有一種方法可以在託管類中聲明它們,就像我在頭文件中一樣。在類B中,它有一個叫做func的函數,這個函數返回類類型C,我試過c = & b-> func(),這樣它會拋出AccessViolationException,如果我試過c = b-> func ,那麼錯誤是函數調用缺少參數。我該怎麼做,請幫助!

+0

b-> func()返回一個臨時對象實例。您正在將它的地址存儲在MyClass :: c中。當構造函數退出時,臨時被銷燬,MyClass :: c包含無效地址。稍後調用otherfunc(),並使用'c'中的無效地址導致訪問衝突。 – tukra

+0

謝謝您的回覆。這有助於我理解。對於這個特定的問題,你知道我有什麼辦法可以實現它嗎?我真的很感激。@ tukra – Chen

回答

0

從你寫的我的猜測是,B :: FUNC()被聲明爲返回一個C實例作爲一個臨時的:

class B { 
public: 
    C func(); 
}; 

分配一個C的實例作爲臨時副本:

class A { 
}; 

class C { 
public: 
    C(int _i) : i(_i) {} 
    int func_c() { return i; } 

    int i; 
}; 

class B { 
public: 
    B(A & a) {} 
    C func() { return C(5); } 
}; 

public ref class MyClass { 
public: 
    MyClass(); 
    ~MyClass(); 
    int otherfunc(); 
private: 
    A *a; 
    B *b; 
    C *c; 
}; 

MyClass::MyClass() 
{ 
    a = new A(); 
    b = new B(*a); 
    c = new C(b->func()); 
} 

MyClass::~MyClass() { 
    delete a; 
    delete b; 
    delete c; 
} 

int MyClass::otherfunc() 
{ 
    return c->func_c(); 
} 

void f() { 
    MyClass^ mc = gcnew MyClass(); 
    int i = mc->otherfunc(); 
} 

這個假設C是可複製的(或可移動的),並且複製它對你正在做的事情有意義。

+0

C是一個非託管類,我不認爲我可以用你的方式宣佈它。@ tukra – Chen

+0

哈,當然。我將這個例子修正爲完整的工作代碼。 – tukra

相關問題