在托管C ++ / CLI中,我可以将其作为(1):
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};
}
}
谢谢!
答案 0 :(得分:2)
初始化和分配之间必须有所不同。就像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;
}
}
这样,指定的值就会复制到您的数组中。
修改强>
不幸的是,STL容器没有swap
方法(至少我不知道),否则你可以用临时内容交换内容。
答案 1 :(得分:1)
在使用聚合初始化程序分配数组时,您应该能够跳过size参数。例如,以下代码为我编译:
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>
是必需的。
答案 2 :(得分:0)
好像你想要初始化那样的数组
(array = {elem1, elem2,etc})
你需要在申报时这样做。声明也只有本地范围,即退出声明数组的函数时不能安全地使用内存,在这种情况下,您需要使用new分配内存。在后一种情况下,不要忘记在应用程序不再需要时删除您的对象。
如果您只需要在本地或在来自该特定函数的函数调用期间使用它,则为1 如果你在函数退出时在别处需要它,那就是2。
答案 3 :(得分:0)
我认为你坚持(2)。
在C99中,你实际上可以使用复合文字来做(3),但我不知道在C ++ / CLI中是否有这样的东西。无论如何,它对你的问题没有帮助:在函数体中使用复合文字将堆栈,而不是堆分配数组。
对于初始化后的堆分配,new
,gcnew
,malloc()
,...