我理解如果我想在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} };
我该如何解决这个问题?
答案 0 :(得分:9)
您的第一个代码段工作正常。您只需将其更改为:
const c::p c::pp[2] = { {1,1},{2,2} };
答案 1 :(得分:2)
大多数时候你不应该有私有静态成员,而且我看到这个也不例外。
相反,您完全从可见性中删除结构,将它和实例放入您的类函数所在的编译单元的匿名名称空间中。
该类的用户不需要查看实现细节。
例外情况是struct或私有静态成员函数需要访问类的私有成员。如果是这种情况,你至少需要在类标题中声明它作为朋友的存在,这样你就不会失去任何东西,只要你必须显示它就是静态的。
答案 2 :(得分:0)
您需要将pp
与c::
一起限定为
const c::p c::pp[2] = { {1,1},{2,2} };
否则,您尝试将新数组定义到全局范围,而不是初始化成员。