我这里通过实现一个类似iOS的HUD的类,来例子说明用c++怎么创建一个单例,直接上代码
头文件:
#ifndef HintTextHUD_hpp
#define HintTextHUD_hpp
#include <stdio.h>
#include "ui/CocosGUI.h"
using namespace std;
using namespace cocos2d;
/// 提示信息
class HintTextHUD:public Layer
{
private:
Label* _messageLabel; //文字提示label
HintTextHUD();
~HintTextHUD();
static HintTextHUD * __instance;
public:
static HintTextHUD* getInstance();
CREATE_FUNC(HintTextHUD);
bool createLayer(const string& _message);
void removeFromParent(float a);
void initOptions(const string& _message);
inline virtual Label* getMessageLabel(){return _messageLabel;};
};
#endif /* HintTextHUD_hpp */
实现文件:
#include "HintTextHUD.hpp"
using namespace experimental;
CC_DLL;
HintTextHUD* HintTextHUD::__instance = NULL;
HintTextHUD* HintTextHUD::getInstance() {
if (__instance == NULL) {
__instance = new HintTextHUD();
}
return __instance;
}
HintTextHUD::HintTextHUD(){}
HintTextHUD::~HintTextHUD(){}
bool HintTextHUD::createLayer(const string &_message){
if (!Layer::init()) {
return false;
}
this->setColor(Color3B(192,192,192));
this->setContentSize(Size::Size(1,1));
this->setAnchorPoint(Vec2(0,0));
this->initOptions(_message);
this->schedule(schedule_selector(HintTextHUD::removeFromParent),2.0f);
return true;
}
void HintTextHUD::initOptions(const string &_message){
_messageLabel = Label::create();
_messageLabel->setString(_message);
_messageLabel->setSystemFontSize(35);
_messageLabel->setHorizontalAlignment(TextHAlignment::CENTER);
_messageLabel->setColor(Color3B(0,0,0));
addChild(_messageLabel,1);
Size contentSize = Director::getInstance()->getVisibleSize();
_messageLabel->setPosition(Vec2(contentSize.width/2, contentSize.height/2));
}
void HintTextHUD::removeFromParent(float a){
removeFromParentAndCleanup(true);
}
看完代码意思大概懂了吧?和OC 差不多,需要一个static变量和类函数,然后就是要把构造函数和析构函数私有化。看看怎么用:
auto _hud = HintTextHUD::getInstance();
_hud->createLayer("账号或密码错误!");
this->addChild(_hud, 2);
OK,大概就是这样