我在线阅读了一篇文章,源代码是:
class ASingleton
{
public:
static ASingleton* getInstance()
{
return &m_data;
}
void do_something()
{
cout<<"ASingleton do_something!"<<endl;
}
protected:
static ASingleton m_data; //static data member 在类中声明,在类外定义
ASingleton();
~ASingleton() {}
};
class BSingleton
{
public:
static BSingleton* getInstance()
{
return &m_data;
}
void do_something()
{
cout<<"BSingleton do_something!"<<endl;
}
protected:
static BSingleton m_data; //static data member 在类中声明,在类外定义
BSingleton();
~BSingleton() {}
};
ASingleton ASingleton::m_data;
BSingleton BSingleton::m_data;
ASingleton::ASingleton()
{
cout<<"ASingleton constructor!"<<endl;
BSingleton::getInstance()->do_something();
}
BSingleton::BSingleton()
{
cout<<"BSingleton constructor!"<<endl;
}
int main()
{
return 0;
}
运行后,结果如下:
ASingleton constructor!
BSingleton do_something!
BSingleton constructor!
我的问题是:两个类的构造函数都受到保护,为什么它们不能被定义调用(ASingleton ASingleton :: m_data; BSingleton BSingleton :: m_data;)?我认为受保护的函数只能在子类中调用,不是吗?
答案 0 :(得分:2)
此处没有违规行为。 ASingleton
使用public static
方法getInstance()
返回实例。
由于getInstance()
是ASingleton
的成员,因此它可以完全访问其类中实现的所有方法。它不会因为它是static
而成为课堂的外部。
此外,m_data
只是这些单例的一个实例。它们在运行时在它们自己的类声明范围内静态初始化。