C ++中的混合管理

时间:2012-02-14 20:00:25

标签: c++-cli managed

我已经为我的程序添加了一个类并对其进行了测试。我真的很惊讶有任何真正的错误。这是代码:

#pragma once
#include "Iingredient.h"
#include <string>
#include <vector>

using namespace std;

ref class Recipe{
private:
    string partsName;
    vector<Iingredient> ing;
public:
    Recipe(){}

};

以下是错误:

  

错误23错误C4368:无法将“partsName”定义为托管成员   '食谱':混合类型不是   支持c:\ users \ user \ documents \ visual studio   2010 \ projects \ smestras2_l1 \ Recipe.h 10 1 file2_L1

     

错误24错误C4368:无法将'ing'定义为托管成员   '食谱':混合类型不是   支持c:\ users \ user \ documents \ visual studio   2010 \ projects \ smestras2_l1 \ Recipe.h 11 1 file2_L1

我google了一下,发现它是关于托管和非托管代码的。 如何解决这个问题?它是否与manged和非托管代码相关?如果是这样的话?

4 个答案:

答案 0 :(得分:11)

我同意其他人的观点:在大多数情况下你不应该使用C ++ / CLI,你应该使用C#(或其他“普通”托管语言)(假设你想编写一个.Net应用程序)。 C ++ / CLI主要用于特殊情况,例如托管代码和非托管代码之间的互操作。

如果您确定要使用C ++ / CLI,则不能将本机类放入托管类。但是你可以将指针放到那里的本地类中:

ref class Recipe{
private:
    string* partsName;
    vector<Iingredient>* ing;
};

上面的代码有效。但是你必须记住那些是正常的本机C ++指针,这意味着你必须手动delete它们。要执行该属性,您应该阅读有关析构函数和终结器如何在C ++ / CLI中工作的信息。

答案 1 :(得分:3)

定义ref class Recipe时,您已将其设为托管。但std::stringstd::vector是非管理类型。您正尝试在托管类中声明本机变量,但不允许这样做。

好像,你是C ++的新手。只是,不要使用C ++ / CLI。如果您的目标是.Net或非托管C ++,请考虑使用C#。

答案 2 :(得分:3)

您不能在托管类ref关键字中使用非托管类型,因为堆和托管堆是两种不同类型的内存。要解决此特定问题,您可以使用托管字符串类型(System::String^)。胡萝卜告诉编译器该类型是托管类的句柄。

解决此问题的另一种方法是使用指针,这样指针将位于托管堆上,该对象的实际内存将位于标准的非托管堆中,这是Recipe所在的位置位于。

构建你必须要做的Recipe课程

Recipe^ recipe = gcnew Recipe();

答案 3 :(得分:1)

不知道c ++ - cli,我可以尝试猜测问题是你正在定义一个引用类型并尝试在(std::string字段)中使用C ++类型而不是等效的托管类型是(String?)。

这可能有问题的原因是它混合了资源管理方法。引用类型旨在用于垃圾收集器,除非您实现析构函数,否则只有在证明最后一个引用丢失后才会忽略IDisposable。另一方面,为了能够管理内部字段中的内存,必须调用std::string析构函数。