歪斜的价值观?

时间:2014-05-26 04:15:16

标签: c++ pointers

我有以下cpp代码:

Pong::Pong()
{
    PongPaddle pp1(0, 240/2 - 5, 10, 40, 40, 41);
    PongPaddle pp2(320-10, 240/2 - 5, 10, 40, 38, 39);

    //p1 = (PongPaddle*) malloc(sizeof(PongPaddle));
    //p2 = (PongPaddle*) malloc(sizeof(PongPaddle));
    p1 = &pp1;
    p2 = &pp2;

    Serial.print("X: ");Serial.println((*p1).x);
    Serial.print("Y: ");Serial.println((*p1).y);

    PongBall ppb(240/2, 320/2, 5, p1, p2);
}

和标题为:

class Pong {
    public:
        Pong();
        void update();
        void draw(Adafruit_TFTLCD tft);
        PongPaddle *p1;
        PongPaddle *p2;
        PongBall *pb;
};

PongPaddle有一个更新类,当它被调用时,它的x& y值不是我设置的值,而只是随机数。我的猜测是我搞砸了指针。 (我尝试使用malloc,它没有看到帮助)

3 个答案:

答案 0 :(得分:2)

pp1pp2Pong构造函数的本地对象。在构造函数的末尾,它们不再存在,使p1p2成为悬空指针。

为什么不让PongPaddle个对象作为成员,而不是指向PongPaddle个对象?

答案 1 :(得分:0)

Benjamin Lindley的回答指出了代码中的真正问题。如果您必须使用Pong中的指针,请将Pong::Pong更改为:

Pong::Pong()
{
    p1 = new PongPaddle(0, 240/2 - 5, 10, 40, 40, 41);
    p2 = new PongPaddle(320-10, 240/2 - 5, 10, 40, 38, 39);

    Serial.print("X: ");Serial.println((*p1).x);
    Serial.print("Y: ");Serial.println((*p1).y);

    PongBall ppb(240/2, 320/2, 5, p1, p2);
}

请记住,使用指针代替类中的对象存在缺陷。你必须实现:

  1. 复制构造函数
  2. 一个析构函数。
  3. 分配运算符
  4. 使用指针p1p2执行正确的操作。

    请参阅The Rule of Three

    更新,以回应OP的最新评论

    Pong::Pong()必须使用构造函数初始化列表中的右参数初始化p1p2。否则,将使用默认构造函数。这就是编译器所抱怨的。

    Pong::Pong() : p1(0, 240/2 - 5, 10, 40, 40, 41),
                   p2(320-10, 240/2 - 5, 10, 40, 38, 39)
    {
        Serial.print("X: ");Serial.println(p1.x);
        Serial.print("Y: ");Serial.println(p1.y);
    
        PongBall ppb(240/2, 320/2, 5, &p1, &p2);
    }
    

答案 2 :(得分:0)

避免长评论链。致OP:请看下面的代码。下面的代码编译正确。

首先是PONGPADDLE.H:

#ifndef PONGPADDLE_H
#define PONGPADDLE_H

class PongPaddle 
{
   public:
      PongPaddle(int, int, int, int, int, int);
};
#endif

下一个PONGBALL.H:

#ifndef PONGBALL_H
#define PONGBALL_H

#include "PongPaddle.h"
class PongBall 
{
   PongPaddle p1;
   PongPaddle p2;
   public:
      PongBall(int, int, int, PongPaddle&, PongPaddle&);
};
#endif

下一个PONG.H:

#ifndef PONG_H
#define PONG_H

#include "PongPaddle.h"
#include "PongBall.h"

class Pong {
public:
    Pong();
    PongPaddle p1;
    PongPaddle p2;
    PongBall pb;
};
#endif

现在这里是PONG.CPP

#include "Pong.h"
Pong::Pong() : p1(0, 240/2 - 5, 10, 40, 40, 41),
               p2(320-10, 240/2 - 5, 10, 40, 38, 39),
               pb(240/2, 320/2, 5, p1, p2)
{
}

请注意,没有使用任何指针。我删除了Serial类型。现在将上面的代码更改为无法编译的代码。或者这是你真正想要完成的事情吗?

缺少的另一件事是PongPaddlePongBall的构造函数的实现。但这是在其他.CPP文件中实现的(可能是PongPaddle.cpp和PongBall.cpp)。