为什么Cocos2D-xv3在c++;? 我是一个新的C++程序员,来自java,我喜欢C++。据我所知,指针通常指向已经初始化的对象的地址。在coocos2d中,为了创建一个对象,您通常会沿着以下几行写一些东西: auto mysprite=Sprite::create("image.png");

为什么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的方法,您可以编写:

   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++中, P1 P2<代码>,java在同一个地方放置了<代码> int x;代码>和
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