为什么静态数据成员能够调用私有和保护构造函数呢?


#1
template<typename _TYPE_>
class CSingletonImpl
{
public:
    static _TYPE_* GetInstance(void)
    {
        if (NULL == m_instance)
        {
            m_instance = new _TYPE_;
        }
        return m_instance;
    }
    static void Release()
    {
        if (NULL != m_instance)
        {
            delete m_instance;
            m_instance = NULL;
        }
    }
protected:
    CSingletonImpl(){}
    virtual ~CSingletonImpl()
    {
        assert(m_instance);
        m_instance = NULL; 
    }
private:
    static _TYPE_* m_instance;
};
template<typename _TYPE_>
_TYPE_* CSingletonImpl<_TYPE_>::m_instance;

class SingletonBase
{
public:
    static CSingletonImpl<int> test;//调用CSingletonImpl保护构造函数,
    //为什么能够编译通过,而如果这个代码移到main函数中就失败。
};

#2

@omegacoleman @xosdy @Jackarain @microcai @mic 坐等解答~


#3

#首先吐槽下

#额, 单例是渣啊, 为啥老有人要去添 java 的菊花.

=======

接着回答, static 成员他还是成员啊, 既然是成员, 自然有 private 的访问权限.


#4

单例模式是拆oop的东墙补逻辑上的西墙,都用c++了不如直接划个namespace出来


#5

看到了这个问题,我一开始也很惊奇,但是想了一下,编译器是对的。 特意注册了一个帐号来说一下我的想法。 //为什么能够编译通过,而如果这个代码移到main函数中就失败。 //首先,标题说的调用就是有问题的,正文代码从来就没有调用到私有和保护函数。 //因为这里就是一个声明,代码中从来没有使用,所以编译链接都能过。 //但如果用的话,因为找不到这个变量的定义,必然会造成链接错误。 //写在main函数中就不是一个声明了,而是定义,定义的话就要分配内存,调用构造函数。 //如果在main函数中写**extern CSingletonImpl test;**也能通过编译的,but你还是不能用,用的话就会链接错误。


#6

嗯嗯,你说的是对的