首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-04-20 
设计模式.单例子类能不能不friend父类,不private构造函数templateclass Tclass Base{public:static T& i

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

热点排行