为什么Cocos2D-xv3在c++;? 我是一个新的C++程序员,来自java,我喜欢C++。据我所知,指针通常指向已经初始化的对象的地址。在coocos2d中,为了创建一个对象,您通常会沿着以下几行写一些东西: auto mysprite=Sprite::create("image.png");
要使用mysprite的方法,您可以编写:为什么Cocos2D-xv3在c++;? 我是一个新的C++程序员,来自java,我喜欢C++。据我所知,指针通常指向已经初始化的对象的地址。在coocos2d中,为了创建一个对象,您通常会沿着以下几行写一些东西: auto mysprite=Sprite::create("image.png");,c++,pointers,cocos2d-x,cocos2d-x-3.0,auto,C++,Pointers,Cocos2d X,Cocos2d X 3.0,Auto,要使用mysprite的方法,您可以编写: mysprite->mymethod(); 我对指针的基本知识是,它们是这样使用的: int* mypoint; int x=7; mypoint=&x; 来自java,这让人很困惑,为什么不创建这样的对象,或者什么时候创建这样的对象,调用类本身,就像这样: Sprite* mysprite=Sprite::create("image.png"); mysprite.mymethod
mysprite->mymethod();
我对指针的基本知识是,它们是这样使用的:
int* mypoint;
int x=7;
mypoint=&x;
来自java,这让人很困惑,为什么不创建这样的对象,或者什么时候创建这样的对象,调用类本身,就像这样:
Sprite* mysprite=Sprite::create("image.png");
mysprite.mymethod();
我认为充分理解这一点很重要,因为cocos2d库中的许多构造函数都使用构造函数中的指针,我发现自己盲目地将auto作为变量的标识符,但我不知道为什么。感谢您事先的澄清
我的问题是为什么我要用“->”而不是“.”
因为左边的东西是指针
如果a
是指针,那么a->b
与(*a).b
相同,只是它看起来更好
< > <代码> a <代码>是指针,则<代码> .b>代码>是一个错误。C++指针中的< p>占用与爪哇中对象引用(AKA对象)的位置相同的位置。在Java中,您可以执行以下操作:
String foo = new String;
当你这样做时,foo
实际上是引擎盖下面的一个指针。您可以这样做,例如:
String foo = new String;
String bar = foo;
这不会创建字符串
的副本,它只是将条
设置为引用与foo相同的字符串
。对于String
而言,这并不是一个重要的区别,因为Java中的String
类型是不可变的。但是,对于这样的事情:
int[][] foo = new int[5][5];
int[][] bar = foo;
bar[0][0] = 6;
那就重要了。设置bar[0][0]
时,还可以设置foo[0][0]
,因为它们引用相同的数组bar
和foo
是对某物的引用,而不是对值的引用。在Java中,这有点模糊,因为您可以拥有的唯一值是基本类型,如int
或float
在C++中,可以有复杂类型的值。例如,如果您这样说:
struct point_2d {
int x, y;
};
void a_function()
{
point_2d p1;
point_2d p2 = p1;
p2.x = 5;
}
首先,请注意缺少new
。在C++中,<代码>新< /COD>用于创建堆上的“事物”,这是java放强>所有< <强> >的不是原始类型。在C++中,inty代码>。在堆栈上。它们在函数退出时被销毁,并不是因为对它们的所有引用都消失了,所以它们被垃圾收集。他们不顾一切地离开了
另外,当你做了p2.x=5代码>,p1.x
的值没有改变。创建p2
时,您从p1
复制了值。您没有创建对它的另一个引用。因此,这些值彼此独立存在
现在,为什么你们的图书馆到处扔指针?C++中的指针就像java引用(换句话说,java中的每个变量不是原始类型)。但是,因为C++中的缺省不是引用(不像java),所以当你有一个时,你必须明确地指出,而当你没有时,
在您的特定情况下,在Sprite::create
函数中的某个地方,库正在执行类似于Sprite*newsprite=newsprite的操作代码>。因此,它在堆上创建了一个Sprite
。很可能,它实际上是一个派生自Sprite
的类,不是Sprite
本身,而是相同的基本思想
您必须一直使用->
而不是
,因为->
用于通过指针访问类的成员,而
用于通过值访问它们。由于Java没有这种区别(您将使用
的任何东西都已经是指针),因此它没有两种不同的语法
这意味着您必须执行删除mysprite代码>在某个时间点释放它正在使用的内存。与java不同,C++不为你做内存管理(又名垃圾回收)。
您正在使用的cocos2d-xv3库似乎有一个相当老式的界面。在现代C++中,由于各种不同的原因,你不能使用裸露的指针。该库应返回一个::std::shared_ptr
或一个::std::unique_ptr
。但这超出了这个问题的范围
但是,库必须使用指针。Sprite
的复制成本可能相当高(特别是因为库似乎使用的是较旧的接口样式,因此可能没有利用诸如移动构造函数之类的漂亮特性),因此库希望在堆上分配一个,并向您传递一个引用(也称为指针),因为这些复制成本很低
另外,在了解发生了什么之前,不要尝试使用auto
。C++的自动类型推导在各种情况下都很好,尤其是在使用容器类时,有时会有迭代器非常复杂的类型名称。但它允许您使用类型,而不必真正知道您正在使用哪些类型。在你的情况下,以你的经验水平,你试图使用的库,这不是很好
这个话题实在太复杂了,回答不了。但这是正在发生的事情的基础,应该在您的最后一个代码块中提供mysprite
仍然是一个指针…嗯,这是正确的,所以我想我的问题是为什么我要使用“->”而不是“.”我知道我没有意识到这一点,所以为什么Cocos2d-x在引擎框架内的所有东西都使用指针哇,非常感谢,我现在明白得更清楚了。当你真正理解你正在键入的内容时,编码就容易得多。@ COSMIK11——等待你开始理解C++引用。它们就像指针,真的,e