cocos2dx主循环的委托模式学习

在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 = NULL
Application* 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居然会是子类的对象,大家可以在下面留言交流一下。或许以后随着我知识的积累,这个问题会迎刃而解。












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值