Cocos2dx风格与实现

时间:2017-09-08 21:38:12

标签: c++ singleton cocos2d-x

我有点回到cocos2dx开发中。这次我想完全理解图书馆的微妙之处。我已经开始很好地理解他们在整个过程中使用的单例类。我对他们的实施有疑问。以下是正在使用的单例类的基本示例

class GlobalClass
{
    int m_value;
  public:
    GlobalClass(int v = 0)
    {
        m_value = v;
    }
    int get_value()
    {
        return m_value;
    }
    void set_value(int v)
    {
        m_value = v;
    }
};

// Default initialization
GlobalClass *global_ptr = 0;

void foo(void)
{
  // Initialization on first use
  if (!global_ptr)
    global_ptr = new GlobalClass;
  global_ptr->set_value(1);
  cout << "foo: global_ptr is " << global_ptr->get_value() << '\n';
}

void bar(void)
{
  if (!global_ptr)
    global_ptr = new GlobalClass;
  global_ptr->set_value(2);
  cout << "bar: global_ptr is " << global_ptr->get_value() << '\n';
}

int main()
{
  if (!global_ptr)
    global_ptr = new GlobalClass;
  cout << "main: global_ptr is " << global_ptr->get_value() << '\n';
  foo();
  bar();
} 

我的问题是关于类定义之后以及foo,bar和main之前的初始化。基本上,我对这一行很感兴趣

GlobalClass *global_ptr = 0;

堆栈实例初始化在哪里?你需要一些接口来指向作为该堆栈实例成员的堆的全局指针,对吧?如果是这样,这在cocos2dx中完成了什么?

我的另一个问题是使用范围解析运算符(::)来调用

等方法
glview = GLViewImpl::create("MyView") 

这有什么用途?这是否超越名称间距以访问单例实例?

如果我的任何理解有误,特别是单身人士,请纠正它们。

1 个答案:

答案 0 :(得分:0)

我认为你的Singleton类的语法是错误的。

应该是这样的:

class GlobalClass
{
    static GlobalClass* _instance;  // Make private so only can access with method to avoid NPE for first time access 
    GlobalClass(int v = 0)          // Make constructor private, you can't create object outside the class        
    {
        m_value = v;
    }

    int m_value;
public:
    static GlobalClass* getInstance();

    int get_value()
    {
        return m_value;
    }
    void set_value(int v)
    {
        m_value = v;
    }
};

GlobalClass* GlobalClass::_instance = 0;

GlobalClass* GlobalClass::getInstance() {

    return GlobalClass::_instance == nullptr ? GlobalClass::_instance = new GlobalClass : GlobalClass::_instance;
}

void foo(void)
{
    auto global_ptr = GlobalClass::getInstance();   
    global_ptr->set_value(1);
    std::cout << "foo: global_ptr is " << global_ptr->get_value() << '\n';
}

void bar(void)
{
    auto global_ptr = GlobalClass::getInstance();
    global_ptr->set_value(2);
    std::cout << "bar: global_ptr is " << global_ptr->get_value() << '\n';
}

int main()
{
    auto global_ptr = GlobalClass::getInstance();
    std::cout << "main: global_ptr is " << global_ptr->get_value() << '\n';
    foo();
    bar();

    system("pause");
    return 0;
}

你的第二个问题:

为什么我们在cocos2d-x的所有类中使用或使用静态方法create()

  • 在cocos2d-x中,我们分两个阶段创建对象

    - Create Object           // No game Logic only set default_values
    - Initialize Object
    
  • 我们在cocos2d-x中使用Reference Count机制进行内存管理。 what is it ?

这些2-phase constructorauto-released reference count一起构成一个静态函数:create()