如何使用C ++初始化const char数组成员?

时间:2012-08-21 08:02:10

标签: 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

我理解错误的原因,但我不知道如何修复它。任何的想法?谢谢!

5 个答案:

答案 0 :(得分:4)

在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'}} {}

答案 1 :(得分:3)

在C ++ 11中,您可以像这样初始化数组:

ABCD() : getByte { 'a','b','c','d','e','f','g','h' }
{ ... }

答案 2 :(得分:1)

如果你有一个C ++ 11兼容的编译器,你应该能够这样使用:

ABCD():ObjNum(3),getByte{'a','b','c','d','e','f','g','h'}

但是如果你的编译器无法处理,你必须在构造函数中手动初始化数组,逐个元素或通过另一个数组然后执行以下操作: memcpy

编辑:如果您的编译器无法处理C ++ 11语法,那么您将非常幸运。但是,GCC至少从4.4版开始,还有VC ++ 2010,它确实可以处理它。因此,除非您有强制要求使用“古代”编译器的要求,否则它应该不是问题。

答案 3 :(得分:1)

最好放弃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;
}

答案 4 :(得分:1)

在C ++ 03中,您可以将成员更改为boost::array类型,并使用返回boost::array<char,8>的函数在构造函数中初始化它。