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

How to Create a Globally Accessible 2d Array in C++/CLI

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

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

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

它失败了,出现了与下面类似的错误。这是我在 class:

中使用它的方式

header:

cliext::vector<Color> test;

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

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

然后我尝试制作一个 class 来存储 3 个颜色变量。这是 header 文件。构造函数只是设置 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 
Studio17\Community\VC\Tools\MSVC.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 
Studio17\Community\VC\Tools\MSVC.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 个元素,但在编译时我不知道外部数组的大小。我该如何实现?

您不能创建 .Net class 对象的向量。您需要一个句柄类型向量。

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

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

类型
ref class Color

总是创建一个新对象完成分配

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

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

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

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