【问题标题】:What is the best way to initialize an array to a fixed-length array? (C++/CLI)将数组初始化为固定长度数组的最佳方法是什么? (C++/CLI)
【发布时间】:2009-01-29 19:32:19
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: arrays c++-cli initialization


    【解决方案1】:

    你必须区分初始化和赋值。就像 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;
        }
    }
    

    这样分配的值就会复制到你的数组中。

    编辑: 不幸的是,没有像 STL 容器那样的 swap 方法(至少我不知道),否则您可以将内容与临时交换。

    【讨论】:

      【解决方案2】:

      在使用聚合初始值设定项分配数组时,您应该能够跳过 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&lt;type&gt; 是必需的。

      【讨论】:

        【解决方案3】:

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

        (array = {elem1, elem2,etc})
        

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

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

        【讨论】:

          【解决方案4】:

          我认为你被 (2) 困住了。

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

          对于初始化后的堆分配,new、gcnew、malloc()、...

          【讨论】:

            猜你喜欢
            • 2020-04-17
            • 2014-09-02
            • 2010-09-21
            • 2021-11-26
            • 1970-01-01
            • 2010-09-17
            • 2021-08-23
            • 1970-01-01
            相关资源
            最近更新 更多