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

问题描述:

在托管C++/CLI,我能做到这一点无论是作为(1):将数组初始化为固定长度数组的最佳方法是什么? (C++/CLI)

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

谢谢!

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

这样分配的值复制到你的阵列。

编辑: 不幸的是没有swap方法像STL容器(至少没有我所知道的),否则你可能只是换用临时的内容。

看来,如果你想初始化数组一样,

(array = {elem1, elem2,etc}) 

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

因此,如果您只需要本地或在该功能调用期间使用该功能,并且在功能退出时在其他地方需要该功能。

我认为你坚持(2)。在C99中,你实际上可以使用复合文字来做(3),但我不知道在C++/CLI中是否有这样的东西。无论如何,这对你的问题没有任何帮助:在函数体中使用复合文字会堆栈 - 而不是堆 - 分配数组。

有关初始化后堆分配,还有据我所知没有办法左右newgcnewmalloc(),...

分配与聚合初始化数组时,你应该能够跳过尺寸参数。例如,下面的代码编译为我:

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>需要不起作用。