我有以下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,但没有帮助)

最佳答案

本杰明·林德利的答案指出了代码中的真正问题。如果必须在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);
}

请记住,在类中使用指针而不是对象是一个陷阱。您必须实现:
  • 复制构造函数
  • 析构函数。
  • 赋值运算符

  • 使用指针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);
    }
    

    08-16 01:12