从[班级名称]到[班级名称]没有合适的转换功能*

时间:2016-11-18 19:51:44

标签: c++-cli

我是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,然后错误是函数调用缺少参数。我该怎么办,请帮忙!!!

1 个答案:

答案 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是可复制的(或可移动的),复制它对你正在做的事情有意义。