为什么cocos 2d-x v3在c ++中经常使用指针?

时间:2017-03-20 03:41:33

标签: c++ pointers cocos2d-x cocos2d-x-3.0 auto

我是来自Java的c ++程序员的新手,我喜欢c ++。据我所知,我认为指针通常指向已经初始化的对象的地址。在coocos2d中经常为了创建一个对象,你可以写下以下内容:

      auto mysprite=Sprite::create("image.png");

并使用mysprite的方法,你会写:

   mysprite->mymethod(); 

我对指针的基本知识就是使用了类似的东西:

   int* mypoint;
   int x=7;
   mypoint=&x;

来自java,这是非常令人困惑的,为什么不会或什么时候创建像这样的对象本身就像这样调用类:

      Sprite* mysprite=Sprite::create("image.png");
       mysprite.mymethod();

我认为这对于完全理解是很重要的,因为cocos2d库中的许多构造函数都在构造函数中使用指针,我发现自己盲目地将auto写为我的变量的标识符,但我不知道为什么。感谢您提前澄清。

2 个答案:

答案 0 :(得分:0)

  

我的问题是为什么我会使用“ - >”而不是“。”

因为左边的东西是指针。

如果a是指针,那么a->b(*a).b相同,但它看起来更好。

如果a是指针,那么a.b就是错误。

答案 1 :(得分:0)

在C ++中,指针与Java中的对象引用(aka对象)占据的位置大致相同。在Java中,您可以执行以下操作:

String foo = new String;

执行此操作时,foo实际上是引擎盖下的指针。您可以这样做:

String foo = new String;
String bar = foo;

这不会创建String的副本,只是设置bar以引用与foo相同的String。对于String,这不是一个重要的区别,因为Java中的String类型是不可变的。但是,对于这样的事情:

int[][] foo = new int[5][5];
int[][] bar = foo;
bar[0][0] = 6;

然后重要。设置bar[0][0]时,您还设置了foo[0][0],因为它们引用了相同的数组。 barfoo是对某些内容的引用,而不是值。在Java中,这有点模糊,因为您可以拥有的唯一值是原始类型,如intfloat

在C ++中,您可以拥有复杂类型的值。例如,如果你这样说:

struct point_2d {
   int x, y;
};

void a_function()
{
    point_2d p1;
    point_2d p2 = p1;
    p2.x = 5;
}

首先,注意缺少new。在C ++中,new用于在堆上创建“事物”,这是Java将所有设置为非基本类型的地方。在C ++中,p1p2位于Java的同一位置int x;int y;。在堆栈上。它们在函数退出时被销毁,而不是因为它们的所有引用都消失了所以它们被垃圾收集。他们无论如何都会离开。

此外,当您执行p2.x = 5;时,p1.x的值未发生变化。创建p2后,您复制了p1中的值。您没有创建另一个引用。所以价值观彼此独立存在。

现在,为什么你的图书馆全都折腾指针?好吧,C ++中的指针就像Java引用(换句话说,Java中的每个变量都不是原始类型)。但是,由于C ++中的默认值不是一个引用(与Java不同),因此您必须明确何时拥有它,何时不需要。

在您的特定情况下,在Sprite::create函数内的某个位置,库正在执行Sprite *newsprite = new Sprite;之类的操作。所以,它在堆上创建了一个Sprite。可能,它实际上是一个派生自Sprite而不是Sprite本身的类,但是基本相同的想法。

您不得不使用->而不是.因为->用于通过指针访问类的成员,.用于通过指针访问它们一个值。由于Java没有这种区别(你使用.的任何东西都是指针),它没有两种不同的语法。

这意味着您必须在某个时间点执行delete mysprite;以释放其正在使用的内存。与Java不同,C ++不会为您进行内存管理(即垃圾收集)。

您使用的这个cocos 2d-x v3库似乎也有一个相当旧式的界面。在现代C ++中,由于各种不同的原因,不鼓励使用裸指针。该库应返回::std::shared_ptr<Sprite>::std::unique_ptr<Sprite>。但这超出了这个问题的范围。

但是,库必须使用指针。复制Sprite可能相当昂贵(特别是因为库似乎使用较旧的界面风格,所以很可能没有利用移动构造函数等漂亮的功能),因此库想要分配一个堆并传递一个引用(也称为指针),因为复制它们很便宜。

另外,在了解正在发生的事情之前,请尽量不要使用auto。 C ++的自动类型推导在各种情况下都非常好,特别是在使用容器类时,有时迭代器的类型名称非常复杂等等。但是它允许你在不知道你正在使用哪些类型的情况下使用类型。在您的情况下,根据您的经验水平,您尝试使用的库,这不太好。

对于StackOverflow答案,此主题实在太复杂了。但这是正在发生和应该提供的基础知识