我有点回到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")
这有什么用途?这是否超越名称间距以访问单例实例?
如果我的任何理解有误,特别是单身人士,请纠正它们。
答案 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 constructor
和auto-released reference count
一起构成一个静态函数:create()