0

上記のエラーのため、クラス オブジェクトのメンバー値を変更できません。

初期化関数を呼び出して「garo」オブジェクトを初期化すると、次の実行時エラーが発生します。

「Heretic.exe の 0x01323976 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000008.」

注: クラス Garo は Object の子です。

コード

ガロ.h

#pragma once
#include "Object.h"

class Garo : public Object
{
private:
    int animationRow;

public:
    Garo();
    void Destroy();

    void Init(ALLEGRO_BITMAP *image = NULL);
    void Update();
    void Render();

    void MoveLeft();
    void MoveRight();
    void Idle();
    void SetAnimationRow(int row);
};

Garo.cpp

#include "Garo.h"

Garo::Garo()
{
    Object::Init(20, 200, 3, 0, 0, 0, 16, 24);
}

void Garo::Init(ALLEGRO_BITMAP *image)
{
    Object::Init(20, 200, 3, 0, 0, 0, 16, 24);

    SetID(PLAYER);
    SetAlive(true);

    maxFrame = 3;
    curFrame = 0;
    frameWidth = 32;
    frameHeight = 48;
    animationColumns = 4;
    animationDirection = 1;

    animationRow = 0;

    if(image != NULL)
        Garo::image = image;
}

...残りは省略されています

Object.h

#pragma once

#include <iostream>
#include <allegro5/allegro5.h>
#include <allegro5/allegro_primitives.h>
#include "Globals.h"

class Object
{
private:
    int ID;
    bool alive;
    bool collidable;

protected:
    float x;
    float y;

    float velX;
    float velY;

    int dirX;
    int dirY;

    int boundX;
    int boundY;

    int maxFrame;
    int curFrame;
    int frameCount;
    int frameDelay;
    int frameWidth;
    int frameHeight;
    int animationColumns;
    int animationDirection;

    ALLEGRO_BITMAP *image;

public:
    Object();
    void virtual Destroy();

    void Init(float x, float y, float velX, float velY, int dirX, int dirY, int boundX,               int boundY);
    void virtual Update();
    void virtual Render();

    float GetX() {return x;}
    float GetY() {return y;}

    void SetX(float x) {Object::x = x;}
    void SetY(float y) {Object::y = y;}

    int GetBoundX() {return boundX;}
    int GetBoundY() {return boundY;}

    int GetID() {return ID;}
    void SetID(int ID) {Object::ID = ID;}

    bool GetAlive() {return alive;}
    void SetAlive(bool alive) {Object::alive = alive;}

    bool GetCollidable() {return collidable;}
    void SetCollidable(bool collidable) {Object::collidable = collidable;}

    bool CheckCollisions(Object *otherObject);
    void virtual Collided(int objectID);
    bool Collidable();
};

オブジェクト.cpp

#include "Object.h"

Object::Object()
{
    x = 0;
    y = 0;

    velX = 0;
    velY = 0;

    dirX = 0;
    dirY = 0;

    boundX = 0;
    boundY = 0;

    maxFrame = 0;
    curFrame = 0;
    frameCount = 0;
    frameDelay = 0;
    frameWidth = 0;
    frameHeight = 0;
    animationColumns = 0;
    animationDirection = 0;

    image = NULL;

    alive = true;
    collidable = true;
}

void Object::Init(float x, float y, float velX, float velY, int dirX, int dirY, int boundX, int boundY)
{
    std::cout << "HERE?" << std::endl;
    Object::x = x;
    Object::y = y;

    Object::velX = velX;
    Object::velY = velY;

    Object::dirX = dirX;
    Object::dirY = dirY;

    Object::boundX = boundX;
    Object::boundY = boundY;
}

呼び出しコード

Garo *garo;
// ...
garo->Init(garo_img);

ここで実行時エラーが発生します。私は Allegro ライブラリを使用しているので、おかしな型についてお気軽にお尋ねください。私はまだC++を学んでいるので、初歩的な言葉で理解するのを手伝ってください。

4

1 に答える 1

5

操作するには、オブジェクトインスタンスをインスタンス化する必要があります。例えば:

garo = new Garo();

これを見逃すことにより、初期化されていない変数でメソッドを呼び出そうとしています。オブジェクトが確実に破棄されるように、何らかの形式のスマートポインタの使用を検討する必要があります。

于 2012-04-04T18:16:53.780 に答える