读书人

设计方式.单例子类能不能不friend父类

发布时间: 2013-04-20 19:43:01 作者: rapoo

设计模式.单例子类能不能不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>这样的类就完了。没有道理还需要继承一下。

读书人网 >C++

热点推荐