2016-11-18 74 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

相关问题