我是c ++ / cli的新手,我遇到的情况是: 我正在做的项目需要使用外部dll,在我的函数中我需要使用来自这个dll的类A,B和C,我把它们放在我的.h文件中,.h文件看起来像:
#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 :(得分: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是可复制的(或可移动的),复制它对你正在做的事情有意义。