如何在 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 中,并且可以从托管代码访问此数据。
我在 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 中,并且可以从托管代码访问此数据。