我在程序中添加了一个类并对其进行了测试。我真的很惊讶有任何真正的错误。这是代码:
#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\visualstudio2010\projects\smestras2_1\Recipe.h 10 1文件2_l1
错误24错误C4368:无法将"ing"定义为托管的成员"配方":混合类型不是支持c:\users\user\documents\visualstudio2010\projects\smestras2_1\Recipe.h 11 1文件2_l1
我在谷歌上搜索了一下,发现它是关于托管和非托管代码的。如何解决此问题?它是否与托管代码和非托管代码相关?如果是,如何?
我同意其他人的观点:在大多数情况下不应该使用C++/CLI,应该使用C#(或另一种"普通"托管语言)(假设您想编写.Net应用程序)。C++/CLI主要在特殊情况下很有用,比如在托管代码和非托管代码之间进行互操作。
如果您确定要使用C++/CLI,则不能将本机类放入托管类中。但是您可以将指针放在本地类中:
ref class Recipe{
private:
string* partsName;
vector<Iingredient>* ing;
};
上面的代码有效。但您必须记住,这些都是普通的本机C++指针,这意味着您必须手动delete
它们。要实现该属性,您应该阅读有关析构函数和终结器在C++/CLI中如何工作的内容。
在定义ref class Recipe
时,您将其管理。而CCD_ 3和CCD_。您正试图在托管类中声明本机变量,但这是不允许的。
看来,你是C++的新手。只是,不要使用C++/CLI。如果您的目标是.Net或非托管C++,请考虑C#。
不能在托管类ref
关键字中使用非托管类型,因为堆和托管堆是两种不同类型的内存。要解决此特定问题,可以使用托管字符串类型(System::String^
)。胡萝卜告诉编译器该类型是托管类的句柄。
解决此问题的另一种方法是使用指针,这样指针将位于托管堆上,而该对象的实际内存将位于标准非托管堆中,也就是Recipe
所在的位置。
要构建Recipe
类,您必须执行
Recipe^ recipe = gcnew Recipe();
由于不知道c++-cli,我可以尝试猜测问题是您正在定义一个引用类型,并试图在(std::string
字段)中使用c++类型,而不是等效的托管类型(String
?)。
这可能有问题的原因是它混合了资源管理方法。引用类型旨在从垃圾收集器中使用,除非实现析构函数或IDisposable
,否则一旦证明最后一个引用丢失,就会被忽略。另一方面,为了能够管理内部字段中的内存,必须调用std::string
析构函数。