Конструктор в классе, вызывающий переменные

Я просмотрел всевозможные руководства и учебные пособия по классам и конструкторам, но до сих пор для меня не имело смысла реализовывать комбинацию обоих в моей программе. Я чувствую, что какой-то массивный логический блок уклоняется от меня. Я был бы невероятно благодарен, если бы кто-нибудь мог объяснить на человеческом языке, как конструктор должен заполнять переменные для моей функции. Как не только как заставить его делать то, что я хочу, но почему это имеет смысл для программы? Я начал учиться в этом году. Спасибо. Это код, который должен быть скомпилирован на эмуляторе GBA, хотя проблема, с которой я столкнулся, связана исключительно с перспективой C++. Я выделил дополнительные комментарии к этому посту в программе жирным шрифтом. Как я понимаю, что я пытаюсь сделать до сих пор:

Я создаю конструктор, который затем получает значения переменных для функции внутри него из основного цикла позже в программе, где я инициализирую объекты класса в первый раз, а затем в той части, где я перерисовываю поле для движения, которое я просто вызываю на объектах класса, которые должны иметь свои начальные значения, хранящиеся в конструкторе.

#include <stdint.h>
#include <stdlib.h>
#include "gba.h"

// A class with variables.
class CHARBOX
{
    public:
    int init_;
    int str_;
    int health_;
    int posx_;
    int posy_;
    int width_;
    int height_;
    int colour_; // someone advised me to name my class variables 
                 // with a special symbol attached.

    public:
// This is probably the part where I have not done things right. When this is 
// compiling, there is an error saying that there is no matching function to 
// call CHARBOX. Which I don`t understand completely.
        // Constructor.
    CHARBOX(int posx, int posy, int width, int height, int colour)
    {
        DrawBox(posx, posy, width, height, colour);
    }

    // Drawing functions.
    void DrawBox(int posx_, int posy_, int width_, int height_, int colour_)
    {
        for (int x = posx_; x < posx_ + width_; x++)
        {
            for (int y = posy_; y < posy_ + height_; y++)
            {
                PlotPixel8(x, y, colour_);
            }
        }
    }
};

// The entry point.
int main()
{
    // Put the display into bitmap mode 4, and enable background 2.
    REG_DISPCNT = MODE4 | BG2_ENABLE;

    // Defining some colour palettes.
    SetPaletteBG(1, RGB(90,0,0));
    SetPaletteBG(2, RGB(0,90,0));
    SetPaletteBG(3, RGB(0,0,90));
    SetPaletteBG(4, RGB(90,90,0));
    SetPaletteBG(5, RGB(90,0,90));

//Here is where the objects get initialized and the constructor is called.
        // Draw the player at a starting location.
    CHARBOX player(10, 24, 6, 8, 1);

    // Draw the enemy at a starting location.
    CHARBOX enemy(80, 24, 6, 8, 2);

// main loop.
    while (true);
    {
        // Clear screen and paint background.
        ClearScreen8(1);

        // Flip buffers to smoothen the drawing.
        void FlipBuffers();

        // Redraw the player.
        if ((REG_KEYINPUT & KEY_LEFT) == 0)
        {
            player.DrawBox(); // This is where the object gets called 
                                      // again to be redrawn.
            posx_--;
        }

        if ((REG_KEYINPUT & KEY_RIGHT) == 0)
        {
            player.DrawBox();
            posx_++;
        }

        if ((REG_KEYINPUT & KEY_UP) == 0)
        {
            player.DrawBox();
            posy_--;
        }

        if ((REG_KEYINPUT & KEY_DOWN) == 0)
        {
            player.DrawBox();
            posy_++;
        }
    WaitVSync();
    }
return 0;
}

1 ответ

Решение

Вам нужно использовать список инициализации членов, чтобы инициализировать членов вашего класса:

CHARBOX(int posx, int posy, int width, int height, int colour):posx_(posx),posy_(posy),width_(width),height_(height), colour_(colour)
{

}

Хорошо для чтения:
Что это за странный синтаксис двоеточия (": ") в конструкторе?

кто-то посоветовал мне назвать переменные класса специальным символом.

Это сделано для того, чтобы вы могли различать имя переменной-члена и имя аргумента переданной функции. Это не обязательно, вы можете просто выбрать разные имена, и это должно быть просто отлично.

почему это имеет смысл для программы?

Конструктор в C++ - это специальная функция-член, которая вызывается всякий раз, когда создается объект класса. Цель конструктора - предоставить возможность правильно инициализировать элементы объекта. Например: ширина_, высота_ и т. д. в вашем случае.

После того, как объект создан, предполагается, что члены класса находятся в действительном и определенном состоянии, чтобы они могли использоваться программой. В вашем случае, если вы не инициализируете элементы в конструкторе, они будут иметь неопределенные значения, т.е. любые случайные значения. Вы действительно не хотите, чтобы функция-член получала width_ и это вернуть значение мусора. Так что вам нужно их инициализировать.

Другие вопросы по тегам