将数组初始化为固定长度数组的最佳方法是什么? (C++/CLI)
问题描述:
在托管C++/CLI,我能做到这一点无论是作为(1):将数组初始化为固定长度数组的最佳方法是什么? (C++/CLI)
array<System::Byte>^ css_keycode = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
或(2):
array<System::Byte>^ css_keycode;
css_keycode = gcnew array<System::Byte>(6) {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
但我显然不能做( 3):
array<System::Byte>^ css_keycode;
css_keycode = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
即使我能做到(4):
array<System::Byte>^ css_keycode = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
array<System::Byte>^ css_keycode_shadow;
css_keycode_shadow = css_keycode;
有没有更好的方法,我失踪了?我想要一个简单/干净的方式来写这样的事:
public ref class decoder {
array<System::Byte>^ css_keycode;
...
decoder(void) {
css_keycode = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
}
}
谢谢!
答
你必须区分初始化和赋值。这就像TobiasWärre在他的帖子中所说的那样。 你不能这样做(3),因为assingnment不适用于初始化括号。 (4)确实有效,因为您正在将新值分配给您的数组。 其实以下应该工作:
public ref class decoder {
array<System::Byte>^ css_keycode;
...
decoder(void) {
array<System::Byte>^ css_keycode_tmp = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
css_keycode = css_keycode_tmp;
}
}
这样分配的值复制到你的阵列。
编辑: 不幸的是没有swap
方法像STL容器(至少没有我所知道的),否则你可能只是换用临时的内容。
答
看来,如果你想初始化数组一样,
(array = {elem1, elem2,etc})
你需要在声明做等。该声明也只有局部范围,即在退出声明数组的函数时,不能安全地使用内存,在这种情况下,您需要使用新分配内存。在后一种情况下,不要忘记在应用程序不再需要的时候删除对象。
因此,如果您只需要本地或在该功能调用期间使用该功能,并且在功能退出时在其他地方需要该功能。
答
我认为你坚持(2)。在C99中,你实际上可以使用复合文字来做(3),但我不知道在C++/CLI中是否有这样的东西。无论如何,这对你的问题没有任何帮助:在函数体中使用复合文字会堆栈 - 而不是堆 - 分配数组。
有关初始化后堆分配,还有据我所知没有办法左右new
,gcnew
,malloc()
,...
答
分配与聚合初始化数组时,你应该能够跳过尺寸参数。例如,下面的代码编译为我:
public ref class TestIt
{
public:
TestIt()
{
mArray = gcnew cli::array<System::Byte>{0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
}
private:
cli::array<System::Byte>^ mArray;
};
你的榜样(3)因为gcnew array<type>
需要不起作用。