Cocos2dx 风格与实现

Cocos2dx Style and Implementation

我正在重新投入到 cocos2dx 开发中。这一次,我想充分了解图书馆的精妙之处。我已经开始很好地理解 singleton classes,他们一直在使用它们。我确实对他们的实施有疑问。这是一个使用单例的基本示例 class

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();
} 

我的问题是关于 class 定义之后和 foo、bar 和 main 之前的初始化。本质上,我对这一行感兴趣

GlobalClass *global_ptr = 0;

栈实例在哪里初始化?您需要一些接口用于指向作为该堆栈实例成员的堆的全局指针,对吗?如果是这样,在cocos2dx中是在哪里完成的?

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

中的方法
glview = GLViewImpl::create("MyView") 

这样做的目的是什么?这是为了超越名称间距来访问单例实例吗?

如果我的理解有任何错误,尤其是在单例上,请指正。

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

应该是这样的:

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

的几乎所有 class 都使用或拥有静态方法 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()