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 constructor
和auto-released reference count
一起组成一个静态函数:create()
我正在重新投入到 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 constructor
和auto-released reference count
一起组成一个静态函数:create()