cocos2dx主循环的委托模式学习
来源:互联网 发布:扩散指数的算法 编辑:程序博客网 时间:2024/06/04 18:04
在cocos2dx的主函数中有如下代码:
AppDelegate app;Application::getInstance()->run();
Application::getInstance()得到的对象是app,为什么呢?具体是怎么做到的?请看下面的代码例子。
delegate.h
#ifndef _DELEGATE_H_#define _DELEGATE_H_//抽象类,定义一个接口class BaseInterface{public: BaseInterface(){} virtual ~BaseInterface(){} virtual void dance() = 0; //具体要实现的函数 virtual void cry() = 0; //具体要实现的函数};class Application : public BaseInterface {private: //保存子类的实例 static Application *instance; public: Application(); virtual ~Application(); //得到实例 static Application* getInstance(); //这两个函数具体的实现交给需要委托的子类 virtual void dance(); virtual void cry(); //这是本类(委托)才需要执行的函数 void run();};//这才是任务真正实现的类,但它的调用是由Application来调用的class AppDelegate : public Application{public: AppDelegate(); virtual ~AppDelegate(); //需要具体实现 virtual void dance(); virtual void cry();};#endif //_DELEGATE_H_
在这个delegate.h头文件里,抽象类BaseInterface是一个接口,virtual void dance()和virtual void cry()是子类具体要实现的函数,定义成纯虚函数。
类Application是一个代理(委托)类,继承类BaseInterface,类中定义一个静态本类的指针,通过getInstance()获得实例。run()是要执行的函数,dance()和cry()再此函数中执行。
类Appdelegate才是真正实现dance()和cry()的类,它继承自委托类Application。
delegate.cpp
#include <iostream>#include "delegate.h"#include "assert.h"Application::Application(){ //这一句是核心,this指向子类的对象 instance = this; }Application:: ~Application(){}Application* Application::getInstance(){ assert(instance); return instance;}void Application::dance(){ //不需要具体实现 std::cout<< "Application is dancing" <<std::endl;}void Application::cry(){ //不需要具体实现 std::cout<< "Application is crying" <<std::endl;}//初始化静态成员instance = NULLApplication* Application::instance = NULL;//此处真正执行子类的dance()和cry()void Application::run(){ instance->dance(); instance->cry();}AppDelegate::AppDelegate(){}AppDelegate::~AppDelegate(){}//具体实现void AppDelegate::dance(){ std::cout<< "delegate is dancing" <<std::endl;}void AppDelegate::cry(){ std::cout<< "delegate is crying" <<std::endl;}
在Application的构造函数中instance = this,这一句是核心所在。
测试cpp,testdelegate.cpp
#include "delegate.h"int main(){ AppDelegate app; Application::getInstance()->run(); return 0;}AppDelegate app,它先调用BaseInterface的构造函数,再调用Application的构造函数,最后调用自己的构造函数。
可以在Application和AppDelegate的构造函数里写一句printf("this : %p\n", this),会发现输出结果是一样的,说明
instace = =this, 此处的this就是指向app对象。
Linux下的编译运行
编译:g++ -o test testdelegate.cpp delegate.cpp
运行:./test
输出:delegate is dancing
delegate is crying
其实这地方我还是有点含糊,为什么在Application的构造函数里的*this居然会是子类的对象,大家可以在下面留言交流一下。或许以后随着我知识的积累,这个问题会迎刃而解。
- cocos2dx主循环的委托模式学习
- cocos2dx设计模式---------委托模式
- 【cocos2dx学习笔记】cocos2dx的二段构建模式
- php核心学习-设计模式的学习-委托模式
- Java的委托模式
- cocos2dx v3.0 主循环
- cocos2dx 3.x 主循环每一帧做的事情
- 委托的学习
- vb的委托学习
- 学习简单的委托
- 委托的学习笔记
- vb的委托学习
- 简单的委托学习
- c# 委托的学习
- 委托的学习
- 委托的学习
- C# 委托的学习
- 委托的学习总结
- maven 项目之间的依赖关系
- C# Winform 常用控件介绍
- J
- Pomelo(一):网易开源基于 Node.js 的游戏服务端框架
- 机器学习的相关资源
- cocos2dx主循环的委托模式学习
- Android RxJava
- mysql 存储过程动态拼接sql并执行赋值
- 指针
- linux常用命令123
- EWAHCompressedBitmap数据结构及原理
- NIO 学习(八) selector详解
- Ubuntu上搭建自己的ngrok服务器
- Durid