代码之家  ›  专栏  ›  技术社区  ›  Toybuilder

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

  •  2
  • Toybuilder  · 技术社区  · 15 年前

    在托管C++/CLI中,我可以按以下两种方式进行操作(1):

    array<System::Byte>^ css_keycode = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
    

    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};
    

    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 回复  |  直到 15 年前
        1
  •  2
  •   fmuecke    15 年前

    您必须区分初始化和赋值。就像托比亚斯·沃瑞在他的帖子中说的那样。 你不能这样做,因为援助不适用于 . (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容器(至少据我所知没有),否则您可以用临时容器交换内容。

        2
  •  1
  •   Nick Desjardins    15 年前

    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>

        3
  •  0
  •   Tobias Wärre    15 年前

    (array = {elem1, elem2,etc})
    

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

    因此,如果您仅在本地或在特定函数的函数调用期间需要它,那么

        4
  •  0
  •   Christoph    15 年前

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

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