1

クラスとコンストラクターに関するあらゆる種類のガイドとチュートリアルを調べましたが、これまでのところ、両方の組み合わせをプログラムに実装する方法がわかりませんでした。巨大なロジックブロックが私を回避しているような気がします。コンストラクターが私の関数の変数をどのように入力する必要があるかを人間の言語で説明できる人がいたら、私は非常にありがたいです。私がやりたいことをどうやってやらせるかだけでなく、なぜそれがプログラムにとって意味があるのでしょうか?今年から勉強を始めました。ありがとうございました。これは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;
}
4

1 に答える 1

1

クラスメンバーを初期化するには、メンバー初期化リストを使用する必要があります。

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

}

良い読み物:
コンストラクターのこの奇妙なコロンメンバー( ":")構文は何ですか?

誰かが私のクラス変数に特別な記号を付けて名前を付けるようにアドバイスしてくれました。

これは、メンバー変数名と渡された関数の引数名を区別できるようにするためです。単に別の名前を選択できる必要はなく、問題ないはずです。

なぜそれがプログラムにとって意味があるのですか?

C ++のコンストラクターは、クラスのオブジェクトが作成されるたびに呼び出される特別なメンバー関数です。コンストラクターの目的は、オブジェクトのメンバーを適切に初期化する機会を提供することです。例:あなたの場合、width_、height_など。

オブジェクトが構築されると、プログラムで使用できるように、クラスメンバーは有効で確定状態にあると見なされます。あなたの場合、コンストラクターでメンバーを初期化しない限り、それらは不確定な値、つまり任意のランダムな値を持ちます。width_メンバー関数がを取得し、それがガベージ値を返すことは実際には必要ありません。したがって、それらを初期化する必要があります。

于 2013-01-26T05:38:07.723 に答える