[英]How to initialize a const char array data member with C++?
我有一個與C ++類成員初始化有關的問題。 以下代碼說明了我的問題:
class ABCD
{
public:
ABCD():ObjNum(3){};
~ABCD() {};
static const unsigned char getByte[8];
const int ObjNum;
};
const unsigned char ABCD::getByte[8] = {
'a','b','c','d','e','f','g','h'
};
int main()
{
ABCD test;
cout<<test.getByte[3]<<endl;
return 0;
}
上面的代碼可以很好地工作,但是現在如果我不將getByte [8]設置為靜態的話,如何初始化該類? 我已經嘗試過這種方式,但是失敗了:
class ABCD
{
public:
ABCD():ObjNum(3),getByte('a','b','c','d','e','f','g','h')
{
};
~ABCD() {};
const unsigned char getByte[8];
const int ObjNum;
};
int main()
{
ABCD test;
cout<<test.getByte[3]<<endl;
return 0;
}
我得到的錯誤如下:
error C2536: 'ABCD::ABCD::getByte' : cannot specify explicit initializer for arrays
我知道收到錯誤的原因,但我不知道如何解決。 任何的想法? 謝謝!
在C ++ 11中,您可以像這樣初始化它:
ABCD() : ObjNum(3), getByte{'a','b','c','d','e','f','g','h'} {}
但是,如果要使用C ++ 11,則最好使用std::array
就像其他人在注釋中建議的那樣。 然后可以像這樣定義數組:
const std::array<unsigned char, 8> getByte;
並以這種方式將其初始化(請注意雙括號):
ABCD() : ObjNum(3), getByte{{'a','b','c','d','e','f','g','h'}} {}
在C ++ 11中,您可以像這樣初始化數組:
ABCD() : getByte { 'a','b','c','d','e','f','g','h' }
{ ... }
如果您具有與C ++ 11兼容的編譯器,則應該可以這樣使用:
ABCD():ObjNum(3),getByte{'a','b','c','d','e','f','g','h'}
但是,如果編譯器無法處理,則必須在構造函數中手動初始化數組,可以逐個元素地進行初始化,也可以通過擁有另一個數組來進行初始化,例如執行
memcpy
。
編輯:如果您的編譯器無法處理C ++ 11語法,則您很不走運。 但是,至少從4.4版以及VC ++ 2010起的GCC都可以處理它。 因此,除非您有強制使用“古老”編譯器的要求,否則這不是問題。
最好放棄C數組。 在C ++中,最好使用std :: string。 在這種情況下:
class A
{
public:
A() : s("abcdefgh") {}
private:
std::string s;
}
在C ++ 11中,您可以使用std :: array並使用std :: initializer_list
class A
public:
A() : s{'a','b','c','d','e','f','g','h'} {}
private:
std::array<8> s;
}
在C ++ 03中,您可以將成員更改為boost :: array類型,並使用返回boost::array<char,8>
的函數在構造函數中對其進行初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.