C ++类中的静态Const初始化结构数组

时间:2011-01-05 14:19:58

标签: c++ arrays class initialization

我理解如果我想在C ++中的类命名空间中使用const数组,我不能这样做:

class c
{
private:
  struct p
  {
    int a;
    int b;
  };
  static const p pp[2];
};

const c::p pp[2] =  { {1,1},{2,2} };

int main(void)
{
  class c;
  return 0;
}

我必须这样做:

class c
{
public:
  struct p
  {
    int a;
    int b;
  };
  static const p pp[2];
};

const c::p pp[2] =  { {1,1},{2,2} };

int main(void)
{
  class c;
  return 0;
}

但是当我希望它们是私密的时,这需要“p”和“pp”公开。 C ++中没有办法初始化私有静态数组吗?

编辑:------------------- 谢谢你的回答。另外我希望这个类只是一个库,只有头文件,供主项目使用。当包含多个文件时,包括以下初始化程序会导致“多个定义”错误。

const c::p c::pp[2] =  { {1,1},{2,2} };

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:9)

您的第一个代码段工作正常。您只需将其更改为:

const c::p c::pp[2] =  { {1,1},{2,2} };

答案 1 :(得分:2)

大多数时候你不应该有私有静态成员,而且我看到这个也不例外。

相反,您完全从可见性中删除结构,将它和实例放入您的类函数所在的编译单元的匿名名称空间中。

该类的用户不需要查看实现细节。

例外情况是struct或私有静态成员函数需要访问类的私有成员。如果是这种情况,你至少需要在类标题中声明它作为朋友的存在,这样你就不会失去任何东西,只要你必须显示它就是静态的。

答案 2 :(得分:0)

您需要将ppc::一起限定为

const c::p c::pp[2] = { {1,1},{2,2} };

否则,您尝试将新数组定义到全局范围,而不是初始化成员。