如何在C ++ / CLI中创建全局可访问的2d数组

时间:2017-10-05 02:17:50

标签: arrays multidimensional-array c++-cli

我在使用C ++ / CLI中的类中的所有函数可以访问的数组时遇到了很多麻烦。由于它是C ++ / CLI,std :: vector不起作用。 Boost :: array引发有关与托管类型一起使用的非托管类型的错误。我不想使用指针数组,因为我想获得数组的大小。 System :: List太慢了(我的程序中每个ms都很重要,但如果它有用,我不关心数组的写入速度,一次只能读取一个元素的速度)。 cliext :: vector是我得到的最接近的工作。

我创建了一个带有int的单维cliext :: vector,它起作用了。但是,当我尝试使用

cliext::vector<cliext::vector<int>> test;

它失败了,出现了与下面类似的错误。以下是我在班上使用它的方法:

标题:

cliext::vector<Color> test;

我在构造函数中为它设置了值:

test = gcnew cliext::vector<Color>(5);
test[0] = Color(255,255,255);

然后我尝试创建一个可以存储3个颜色变量的类。这是头文件。构造函数只设置r,g,b值:

namespace FrameCalculator {
class Color {
public:
    Color(int r, int g, int b);

    int r;
    int g;
    int b;
};

然而,这并没有奏效,它把错误扔到了下面:

1>E:\Microsoft Visual 
Studio\2017\Community\VC\Tools\MSVC\14.11.25503\include\cliext\vector(1091): 
note: see reference to class template instantiation 
'cliext::impl::vector_base<_Value_t,false>' being compiled
1>        with
1>        [
1>            _Value_t=FrameCalculator::Color
1>        ]`

1>E:\Microsoft Visual 
Studio\2017\Community\VC\Tools\MSVC\14.11.25503\include\cliext\vector(615): 
error C3671: 'cliext::impl::vector_impl<_Value_t,false>::SyncRoot::get': 
function does not override 'System::Collections::ICollection::SyncRoot::get'
1>        with
1>        [
1>            _Value_t=FrameCalculator::Color
1>        ]`

每个错误大约有5个。我究竟做错了什么?如何获得一个不慢的二维数组,可以全局访问。我不需要两个阵列都是动态的(我不喜欢它们)。我知道内部数组将有3个元素,但我在编译时不知道外部数组的大小。我如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

您无法创建.Net类对象的向量。你需要一个句柄类型的向量。

test = gcnew cliext::vector<Color^>(5);

此外,您的类对象必须是ref class

类型
ref class Color

通过始终创建新对象来完成分配

test[0] = gcnew Color(255,255,255);

您也可以使用完全不受管理的类型,但是您必须在C ++ / CLI代码中使用指向此数据的指针。

托管类型永远不会拥有非托管类型。他们可能拥有指向非托管类型的指针。

因此,您可以将所有管理的数据放入一个非托管类中,并从托管代码中访问此数据。