Cocos2dx C++单例方法实现

引擎内部使用的方法:

CCFileUtils.h

class CC_DLL FileUtils
{
public:
    /**
     *  Gets the instance of FileUtils.
     */
    static FileUtils* getInstance();

    /**
     *  Destroys the instance of FileUtils.
     */
    static void destroyInstance();
}

CCFileUtils-win32.cpp
 

FileUtils* FileUtils::s_sharedFileUtils = nullptr;

FileUtils* FileUtils::getInstance()
{
    if (s_sharedFileUtils == nullptr)
    {
        s_sharedFileUtils = new FileUtilsWin32();
        if(!s_sharedFileUtils->init())
        {
          delete s_sharedFileUtils;
          s_sharedFileUtils = nullptr;
          CCLOG("ERROR: Could not init CCFileUtilsWin32");
        }
    }
    return s_sharedFileUtils;
}

我自己写的:

方法一:调用getInstance方法时才有可能生成新对象

注:多线程可能有bug,不过看引擎内部很多都是这样实现的,应该也没什么问题。

GameScene.h

class GameScene:public Layer
{
//把构造函数与析构函数设为私有类型的原因是因为我们希望使用单例模式,以此减少资源开支
private:
	GameScene();
	//析构函数设置为虚函数的目的我们希望在继承的时候子类重载
	virtual ~GameScene();
	static GameScene* _instance;

public:
	//对外提供的获取本类单例的接口
	static GameScene* getInstance();
}

GameScene.cpp

GameScene::GameScene()
{

}

GameScene::~GameScene()
{

}

GameScene* GameScene::_instance=nullptr;

GameScene* GameScene::getInstance()
{
	if (_instance)
	{
		return _instance;
	}
	_instance = new GameScene;
	return _instance;
}

 

方法二:编译时就生成一个新对象,调用getInstance方法时直接返回对象。

推荐使用这种方法,安全简单。

CloseMenu.h

class CloseMenu
{
public:
	static CloseMenu* getInstance();
private:
	static CloseMenu* instance;
	CloseMenu();
	~CloseMenu();
};

CloseMenu.cpp

CloseMenu* CloseMenu::instance = new CloseMenu;

CloseMenu* CloseMenu::getInstance()
{
	return instance;
}

CloseMenu::CloseMenu()
{
}


CloseMenu::~CloseMenu()
{
}

 

你可能感兴趣的:(C++,COCOS2D-X,Cocos2d-X,二维游戏开发)