2

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

4 回答 4

2

您必须区分初始化和分配。就像 Tobias Wä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 容器这样的方法(至少我不知道),否则你可以将内容与临时交换。

于 2009-09-30T09:15:00.410 回答
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>是必需的。

于 2009-05-06T14:44:59.227 回答
0

好像你想像这样初始化一个数组

(array = {elem1, elem2,etc})

你需要在声明时这样做。声明也只有局部作用域,即在退出声明数组的函数时不能安全地使用内存,在这种情况下,您需要使用 new 分配内存。在后一种情况下,不要忘记在应用程序不再需要对象时删除它。

因此,如果您仅在本地或从该特定函数调用函数期间需要它,则为 1,如果您在函数退出时在其他地方需要它,则为 2。

于 2009-01-29T19:39:24.600 回答
0

我认为你坚持(2)。

在 C99 中,您实际上可以使用复合文字来执行 (3),但我不知道 C++/CLI 中是否有类似的东西。无论如何,这对您的问题没有帮助:在函数体中使用复合文字将堆栈分配,而不是堆分配数组。

对于初始化后的堆分配,没有办法解决new, gcnew, malloc(),...

于 2009-01-29T20:18:11.497 回答