将数组初始化为固定长度数组的最佳方法是什么? (C ++ / CLI)

时间:2009-01-29 19:32:20

标签: arrays c++-cli initialization

在托管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};
    }
}

谢谢!

4 个答案:

答案 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中是否有这样的东西。无论如何,它对你的问题没有帮助:在函数体中使用复合文字将堆栈,而不是堆分配数组。

对于初始化后的堆分配,newgcnewmalloc(),...

无法解决