宣告與初始化陣列成員與類別成員

先前資訊安全的作業Java的AES程式,想改為想使用BCB改為C++版實作,在改變實作語言時遇到小trouble,我有下面一個只擁有常數資料的類別:

public class AESTables {
 public static final byte[] Sbox = {
  (byte)0x63 ,(byte)0x7c ,(byte)0x77 ,(byte)0x7b ...
 }
 ...
}

而直接的想法是下面這個樣子,我認為這樣應該就OK了(嘆)

class AESTables {
 public:
 static const unsigned char Sbox[] = {
  0x63 ,0x7c ,0x77 ,0x7b ...
 }
 ...
}

結果是沒有辦法compile,我try'n'error許久,最後的結論是只有下面這樣才能compile。

class ts {
 public:
 const static int a = 10;
 const static int b[];
};

但是這樣只能宣告成功,卻沒辦法使用它,一使用就會產生LinkError。而想要利用default constructor初始化陣列,compiler則是會給予const存取拒絕或認定為不正常的語法。

最後在 Google 上找到解決方案了,不過老實說,這方法沒有寫過還真不知道它存在。

class ts {
 public:
 const static int a = 10;
 const static int b[];
  const static ClassC c;
};
const int ts::b[] = {1, 1, 1, -10, -1};
const ClassC ts::c = ClassC();
const ClassC ts::c(); //簡寫


使用關鍵字:
C++ static class member array initialization

2007-10-01 備註
今天在以前買的參考書中也看到相同寫法了,由此可見以前都沒學好(汗)。

留言