设计方式.单例子类能不能不friend父类,不private构造函数

设计模式.单例子类能不能不friend父类,不private构造函数
template<class T>
class Base
{
public:
    static T& instance(){static T instance;return instance;}
};
class Derived : public Base<Derived>
{
//begin
    friend class Base;
private:
    Derived(){}
//end
}
这里有没有办法能让父类再复杂一点,从而省掉子类的//begin 到//end之间的代码?请高手指教!
设计模式 单例 C++ friend 构造函数

------解决方案--------------------
你的意图应该是这样吧:

template<class T>
class Base
{
friend T;
private:
Base(){}
public:
static T& instance(){static T instance;return instance;}
};
class Derived : public Base<Derived>
{
public:
Derived(){}
};

------解决方案--------------------
引用:
不过这样Derived可以new出来的


不想new就也改成私有呗,public的构造函数显然就是可以new的啊
------解决方案--------------------
引用:
不过这样Derived可以new出来的


话说 直接定义一个 Base<Derived> 就可以了 已经就是单例的了
干嘛还要继承呢 
------解决方案--------------------
引用:
不好意思,真是高手!!!!!
friend T;

friend class T;
有啥子区别?这个真心没注意到。。。


这个一直就是这样写的 我也没注意过为什么这样写。。。
------解决方案--------------------
不希望一个对象被new只能私有它的构造函数, 
但是其实私有构造并不是真的能阻止new一个这个对象 比如

class A
{
public:
void SetA(int a){m_a = a;}

private:
A(){}
int m_a;
};

A *p = (A *)malloc(sizeof(A));
p->SetA(10);



所以 应该有限度的使用语法糖
------解决方案--------------------
你的这个场景 
你完全可以将 AbcDataMgr的构造私有,ResourceFactory_map的构造一样私有,当然这样只能做到不可以直接被new出来,至于是否继承ResourceFactory_map看你自己需要

使用时类似:

template<class T>
class ResourceFactory_map
{
private:
    ResourceFactory_map(){}
public:
    static T& instance(){static T instance;return instance;}
};

class XXXMgr
{
    friend ResourceFactory_map<XXXMgr>;
private:
    XXXMgr(){}
    XXXMgr(XXXMgr& other){}
};

XXXMgr &a = ResourceFactory_map<XXXMgr>::instance();


------解决方案--------------------
其实用多了

引用:
引用:
不过这样Derived可以new出来的

话说 直接定义一个 Base<Derived> 就可以了 已经就是单例的了
干嘛还要继承呢


同样的这个疑问,很多第三方库写单例也就是提供一个singleton<T>这样的类就完了。没有道理还需要继承一下。