C ++ частная переменная Memeber, недоступная для функции Memeber - PullRequest
0 голосов
/ 09 мая 2020

Я работаю над воссозданием pong, и при перемещении функции drawPaddle из основного класса Game в класс Paddle я столкнулся с проблемой, когда функция не могла прочитать переменные-члены (даже если они находятся в том же классе). Класс находится в файле заголовка, а определения функций - в файле cpp. Рассматриваемые переменные: высота, ширина, xPos и ​​yPos.

Класс Paddle

#include "Graphics.h"

class Paddle
{
public:
    void setX(int z)
    {
        xPos = z;
    }
    int getX()
    {
        return xPos;
    }
    void setY(int z)
    {
        yPos = z;
    }
    int getY()
    {
        return yPos;
    }
    int getWidth() {
        return width;
    }
    void setHeight(int z)
    {
        height = z;
    }
    int getHeight()
    {
        return height;
    }
    void setPlayer(bool z)
    {
        player = z;
    }
    bool getPlayer()
    {
        return player;
    }

private:
    //functions
    void drawPaddle(Graphics& gfx);
    void updatePaddle(Graphics& gfx);

    //variables
    int xPos;
    int yPos = Graphics::ScreenHeight / 2 - Paddle::height / 2;
    bool player;
    static constexpr int width = 20;
    int height = 100;
};

функция drawPaddle

#include "Paddle.h"
#include "Graphics.h"

void drawPaddle(Graphics gfx)
{
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < Paddle::height; j++)
        {
            gfx.PutPixel(p.getX() + i, p.getY() + j, Colors::White);
        }
    }
}

Как видите, я пробовал доступ к нему с помощью необработанной переменной (сообщает мне, что переменная не определена), через класс (сообщает мне, что переменная недоступна) и использование для нее геттера (не удалось, потому что он должен быть ссылкой на конкретный экземпляр c). Кто-нибудь знает, что я делаю не так? Спасибо.

1 Ответ

2 голосов
/ 09 мая 2020

В определении вы не указали, что drawPaddle был членом Paddle, поэтому он рассматривал это определение как определение свободной функции, а не как функцию-член. Бесплатные функции не имеют доступа к закрытым членам.

Он должен начинаться с void Paddle::drawPaddle(Graphics gfx)

...