我在使用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个元素,但我在编译时不知道外部数组的大小。我如何实现这一目标?
答案 0 :(得分:0)
您无法创建.Net类对象的向量。你需要一个句柄类型的向量。
test = gcnew cliext::vector<Color^>(5);
此外,您的类对象必须是ref class
类型ref class Color
通过始终创建新对象来完成分配
test[0] = gcnew Color(255,255,255);
您也可以使用完全不受管理的类型,但是您必须在C ++ / CLI代码中使用指向此数据的指针。
托管类型永远不会拥有非托管类型。他们可能拥有指向非托管类型的指针。
因此,您可以将所有管理的数据放入一个非托管类中,并从托管代码中访问此数据。