C ++将类型为ref class的变量List发送到本机类

时间:2019-01-09 12:11:53

标签: class c++-cli

我基本有以下代码。

//*** Field.h ***\\
public ref class Field
{
public:
    String^ Name;
    UInt16 Lenght;
    Field(void);
}

//*** SNVT.h ***\\
public ref class SNVT
{
public:
    String^ Name;
    UInt16 Index;
    List<Field^> FieldList;
    SNVT(void);
}

//*** Viewer.h ***\\
public ref class Viewer
{
public:
    List<SNVT^> SNVT_List;
    Viewer(void);
    SomeViewerFunction();
}

//*** Viewer.cpp ***\\
void SomeViewerFunction()
{
SNVT^ currentSNVT = gcnew SNVT();
Field^ currentField = gcnew Field();
currentField->Name = "Field Name";
currentField->Leght = 10;

currentSNVT->Name = "SNVT Name";
currentSNVT->Index = 1;
currentSNVT->FieldList.Add(currentField);

SNVT_List.Add(currentSNVT);

Tools New_Tools;
New_Tools.SomeToolsFunction(SNVT_List);
}

//*** Tools.h ***\\
class Tools
{
public:
    Tools(void);
    SomeToolsFunction(List<SNVT^> Tools_SNVT_List);
}

//*** Tools.cpp ***\\
void SomeToolsFunction(List<SNVT^> Tools_SNVT_List)
{
/*
use Tools_SNVT_List here
*/
}

因此,我的想法是我将调用SomeViewerFunction,它将向SNVT_List添加数据。然后SomeViewerFunction将创建一个Tools实例,以调用SomeToolsFunction。 SomeToolsFunction使用变量SNVT_List。

但是我得到一个错误;类“ System :: Collections :: Generic :: List”没有合适的副本构造函数。

最后,我要做的就是在Viewer中创建一个SNVT类型的System :: Collections :: Generic :: List类型变量,然后将该变量发送到Tools。 关于如何实现此目标的任何想法吗?

请注意以下内容... 除工具类外,我所有的类都是参考类。类工具必须保留本机类。 我知道在C#中会更容易,但是其他人在C ++中启动了这个项目,所以我必须在c ++中继续;

// 2019-01-10 谢谢David Yaw 我将代码更改为以下代码,并且可以按预期工作。

//*** Field.h ***\\
public ref class Field
{
public:
    String^ Name;
    UInt16 Lenght;
    Field(void);
}

//*** SNVT.h ***\\
public ref class SNVT
{
public:
    String^ Name;
    UInt16 Index;
    List<Field^> FieldList;
    SNVT(void);
}

//*** Viewer.h ***\\
public ref class Viewer
{
public:
    List<SNVT^>^ SNVT_List; // I changed this line from List<SNVT^> SNVT_List;
    Viewer(void);
    SomeViewerFunction();
}

//*** Viewer.cpp ***\\
void SomeViewerFunction()
{
    SNVT_List = gcnew List<SNVT^>(); // I added this line

    SNVT^ currentSNVT = gcnew SNVT();
    Field^ currentField = gcnew Field();
    currentField->Name = "Field Name";
    currentField->Leght = 10;

    currentSNVT->Name = "SNVT Name";
    currentSNVT->Index = 1;
    currentSNVT->FieldList.Add(currentField);

    SNVT_List->Add(currentSNVT); // I changed this line from SNVT_List.Add(currentSNVT);

    Tools New_Tools;
    New_Tools.SomeToolsFunction(SNVT_List);
}

//*** Tools.h ***\\
class Tools
{
public:
    Tools(void);
    SomeToolsFunction(List<SNVT^>^ Tools_SNVT_List); // I changed this line from SomeToolsFunction(List<SNVT^> Tools_SNVT_List); 
}

//*** Tools.cpp ***\\
void SomeToolsFunction(List<SNVT^>^ Tools_SNVT_List) // I changed this line from void SomeToolsFunction(List<SNVT^> Tools_SNVT_List)
{
/*
use Tools_SNVT_List here
*/
}

1 个答案:

答案 0 :(得分:1)

List<Whatever^> Foo

这种类型几乎是不正确的。无论是类成员,方法参数还是局部变量,都应将其切换为List<Whatever^>^ Foo,并使用第二个^。用gcnew List<Whatever^>()初始化它。 (请注意:如果它是值类型的列表,例如int,则^中没有<>。)

列表是引用类型(在C#中为class,在C ++ / CLI中为ref class)。因此,它应该始终是对托管堆上对象的引用,这就是^的含义。

在没有^的情况下,引用类型被放到堆栈中/直接在对象内分配,这在C ++ / CLI中是可能的,但在C#中是不可能的。因此,所有API都不期望使用该类型。这就是为什么出现“列表没有合适的复制构造函数”错误的原因,因为您尝试使用List<Whatever^>,但是复制构造函数使用了List<Whatever^>^

此外,请注意,这不是 C ++。这就是C ++ / CLI,它具有C ++的所有复杂性,C#的所有复杂性以及其中一些自身的复杂性。