0

C++ の学習を始めて 1 ~ 2 日で、Java からここに来ました。しかし、オブジェクトを削除するときに 1 つの問題に遭遇しました。古いオブジェクトを削除した後に新しいオブジェクトを作成しようとすると、問題が発生します。位置、角度、動き、色をRGB形式で保存するクラス「プレーヤー」があります。コードは次のとおりです。

class Player {
    public:
        float posX, posY, motionX, motionY, angle, r, g, b;
        Player (float, float);
        ~Player() {}; 

        void draw() {
            < GLCode goes here.. >
        }
};

Player::Player(float x, float y) {
    posX = x;
    posY = y;
    cout << "created a player object!\n";
}

int main(int argc, char **argv);
void redraw(void);
void update(void);

//Players List
std::vector<Player*> data;

void keyboard(unsigned char key, int x, int y) {
     switch (key) {
        case VK_ESCAPE:
            if (data.size() > 0) {
                Player *p =  data[data.size()-1];
                delete p;
                p = NULL;
                data.pop_back();
                cout << data.size() << endl;
            }
         break;

        case VK_SPACE:
            Player* p = new Player(200, 200);
            data.push_back(p);
         break;
     }
 }

void redraw(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    for (UINT i = 0; i < data.size(); i++) {
        Player* pr = data[i];
        if (pr)
            pr->draw();
    }

    glPopMatrix();
    glutSwapBuffers();
}

void update(int v) {
    glutTimerFunc(20, update, 0);
    glutPostRedisplay();
}

void initGL(int argc, char **argv) {
    < GLCode goes here.. >
}

void initGameLogic(void) {
    // Here I am creating two player objects, one is red color and one is green
    Player* p = new Player(300, 200);
    p->r = 0;
    p->g = 1;
    p->b = 0;
    data.push_back(p);
    p = new Player(400, 200);
    p->r = 1;
    p->g = 0;
    p->b = 0;
    data.push_back(p);
}

void initGameLoop(void) {
    < GLCode goes here.. >
}

int main(int argc, char **argv) {
    initGL(argc, argv);
    initGameLogic();
    initGameLoop();
}

したがって、問題は、ESCを押して(最後のプレーヤーを削除して)この後にSPACEを押すと、プログラムが新しいプレーヤーオブジェクトを作成しますが、どういうわけか(古いプレーヤーオブジェクトは確かに削除しましたが)緑(古いプレーヤーの色)を取得することです色ですが、標準色は黒です。もう一度押すと、新しいプレーヤーが作成され、黒色になります。したがって、すべてのプレイヤーを削除してから次々と作成すると、最初の 2 つは緑と赤の色になります。これは、プログラムがオブジェクト変数をクリーンアップしないことを意味します。float ポインターをクラスに格納し、初期化時にそれらにメモリを割り当ててから、デストラクタで削除できますが、オブジェクトに格納されているすべての変数を削除する必要があるため、デストラクタ メソッドは単に巨大である必要があります。私のコードの何が問題なのですか?

コンストラクター内のすべての変数をリセットする必要がある場合、それはメモリ リークですか、それとも単に変数の初期化の問題ですか?

そして、ええ、私の悪い英語でごめんなさい。

編集: Ivan Ishchenko、モスクワの Vlad、Mohammad Ali Baydoun のおかげで解決しました。ところで、Mohammad Ali Baydoun が私のために働いたように、配列の型を (ポインターではなく) プレーヤー オブジェクトに置き換えるだけです。

4

2 に答える 2

3

コンストラクターは、変数 r、g、b を初期化しません。したがって、演算子 new で作成されたオブジェクトの値が初期化されている場合、変数 r、g、b は任意の値を持ちます。

于 2013-10-18T20:30:12.293 に答える
2

あなたは 2 人の最初のプレーヤーに色を設定していますが、新しいプレーヤーには決して色を設定していません。そのため、新しいプレーヤーの色変数は初期化されておらず、必要なものを何でも格納できます。Player コンストラクタで BLACK で初期化することを検討してください。

于 2013-10-18T20:29:36.157 に答える