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

Я просмотрел всевозможные руководства и учебные пособия по классам и конструкторам, но до сих пор не имело смысла реализовывать комбинацию обоих в моей программе. Я чувствую, что какой-то массивный логический блок уклоняется от меня. Я был бы невероятно благодарен, если бы кто-нибудь мог объяснить на человеческом языке, как конструктор должен заполнять переменные для моей функции. Как не только как заставить его делать то, что я хочу, но почему это имеет смысл для программы? Я начал учиться в этом году. Спасибо. Это код, который должен быть скомпилирован на эмуляторе 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 ++ — это специальная функция-член, которая вызывается всякий раз, когда создается объект класса. Цель конструктора — предоставить возможность правильно инициализировать элементы объекта. для e.x: width_, height_ и т. д. в вашем случае.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]