读书人

Singleton模式c++模板实现出错,该怎

发布时间: 2012-02-27 10:00:22 作者: rapoo

Singleton模式c++模板实现,出错
Singleton.h文件

C/C++ code
#include "iostream"using namespace std;// Singleton模板类template <class T>class Singleton{public:    static inline T* getSingletonPtr()    {        if ( NULL == mSingletonPtr)        {            mSingletonPtr = new T;        }        else        {            cout << "Thie Single already exist!" << endl;        }        return mSingletonPtr;    }        protected:    Singleton() {}    ~Singleton() {}    static T* mSingletonPtr;};// 测试类class Point{public:    Point()    {}        ~Point() {}    void inline outPut()    {        cout << x << y << endl;    }    void inline setMember(int x,int y)    {        this->x = x;        this->y = y;    }protected:private:    int x,y;};


main.cpp
C/C++ code
#include "Singleton.h"int main(){        Singleton<Point> pt;    Point* pt1 = pt.getSingletonPtr();    pt1->setMember(5,3);    pt1->outPut();        while (1)    {    }}

出错:
1>main.cpp
1>d:\program files\microsoft visual studio\myprojects\singleton_test\main.cpp(8) : error C2248: “Singleton<T>::Singleton”: 无法访问 protected 成员(在“Singleton<T>”类中声明)
1> with
1> [
1> T=Point
1> ]
1> d:\program files\microsoft visual studio\myprojects\singleton_test\singleton.h(29) : 参见“Singleton<T>::Singleton”的声明
1> with
1> [
1> T=Point
1> ]
1>d:\program files\microsoft visual studio\myprojects\singleton_test\main.cpp(8) : error C2248: “Singleton<T>::~Singleton”: 无法访问 protected 成员(在“Singleton<T>”类中声明)
1> with
1> [
1> T=Point
1> ]
1> d:\program files\microsoft visual studio\myprojects\singleton_test\singleton.h(30) : 参见“Singleton<T>::~Singleton”的声明
1> with
1> [
1> T=Point
1> ]
1>生成日志保存在“file://d:\Program Files\Microsoft Visual Studio\MyProjects\Singleton_Test\Debug\BuildLog.htm”
1>Singleton_Test - 2 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

请指教

[解决办法]
此时你的Point类是singleton吗, 明显不是, 一般可以这么定义:

// Singleton base class, each class need to be a singleton should
// derived from this class
template <class T> class Singleton
{
protected:
Singleton(){}
public:
static T& Instance()
{
static T instance;
return instance;
}
};

// Concrete singleton class, derived from Singleton<T>
class ExampleSingleton: public Singleton<ExampleSingleton>
{
// so that Singleton<ExampleSingleton> can access the
// protected constructor
friend class Singleton<ExampleSingleton>;

protected:
ExampleSingleton(){}
public:
// This class's real functionalities
void Write(){printf("Hello, World!");}
};

// use this singleton class
ExampleSingleton::Instance().Write();

读书人网 >软件开发

热点推荐