我已经为我的程序添加了一个类并对其进行了测试。我真的很惊讶有任何真正的错误。这是代码:
#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和非托管代码相关?如果是这样的话?
答案 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::string
和std::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
析构函数。