1. 程式人生 > >cocos2d-x中的單例模式運用

cocos2d-x中的單例模式運用

單例模式是什麼我就不贅述了,直接進入正題。

我們在C++往往能用到單例模式,但在cocos2d-x中,運用單例模式時,您是否遇到了麻煩,各種“無法解析”,“error LNK"錯誤出來。

下面我用個例子簡單介紹下單例模式在cocos2d-x是如何編寫的:

這裡我編寫一個類Global,用來儲存遊戲中全域性都可以訪問的唯一變數,這就要求我們隨時可以在任意物件中能訪問Global,來讀取裡面儲存的唯一變數

標頭檔案如下:

#ifndef _GLOBAL_H_
#define _GLOBAL_H_

#include "cocos2d.h"
#include "StartLayer.h"

class Global{
public:
	StartLayer* startLayer; //儲存全域性可以訪問的唯一性變數
	static Global* toIns(); //通過這個方法返回Global物件
protected:
	~Global();
};

#endif

Cpp檔案如下:
#include "Global.h"

using namespace cocos2d;
static Global* share=NULL; //這行非常重要,我們之前犯的錯誤就是C++習慣,將此變數宣告和初始化放在標頭檔案中,導致錯誤
Global::~Global(void){
	startLayer = NULL;
}
Global* Global::toIns(){
	if(!share){
		share = new Global();
		CCLOG("first");
	}
	CCLOG("hello");
	return share;
}

也可以這樣做:

標頭檔案如下:

#ifndef _GLOBAL_H_
#define _GLOBAL_H_

#include "cocos2d.h"
#include "StartLayer.h"

class Global{
public:
	StartLayer* startLayer;
	static Global* toIns();
	static Global* share;  //靜態變數宣告在這裡
protected:
	~Global();
};

#endif

CPP檔案如下:
#include "Global.h"

using namespace cocos2d;
//static Global* share=NULL;
Global* Global::share = NULL;  //靜態變數初始化放在這,而不是放在標頭檔案中
Global::~Global(void){
	startLayer = NULL;
}
Global* Global::toIns(){
	if(!share){
		share = new Global();
		CCLOG("first");
	}
	CCLOG("hello");
	return share;
}


將程式碼運用到你的工程中,你學會了嗎?

例外你也可以參考cocos2d-x中本身的單例(例如CCDirector)裡面的程式碼,它們是如何例項單例的