我有以下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,它没有看到帮助)
答案 0 :(得分:2)
pp1
和pp2
是Pong
构造函数的本地对象。在构造函数的末尾,它们不再存在,使p1
和p2
成为悬空指针。
为什么不让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);
}
请记住,使用指针代替类中的对象存在缺陷。你必须实现:
使用指针p1
和p2
执行正确的操作。
更新,以回应OP的最新评论
Pong::Pong()
必须使用构造函数初始化列表中的右参数初始化p1
和p2
。否则,将使用默认构造函数。这就是编译器所抱怨的。
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
类型。现在将上面的代码更改为无法编译的代码。或者这是你真正想要完成的事情吗?
缺少的另一件事是PongPaddle
和PongBall
的构造函数的实现。但这是在其他.CPP文件中实现的(可能是PongPaddle.cpp和PongBall.cpp)。