Змеиная игра с C ++ OOB - PullRequest
       42

Змеиная игра с C ++ OOB

1 голос
/ 19 сентября 2019

Я написал игру змея на с ++ в консоли, и у меня есть некоторые проблемы, которые я не могу понять.Кто-нибудь может мне помочь?Согласно приведенному ниже коду:

class Snake : public Fruit{
    private:
        int head;
        short dir_x;    //-1 (left or down) / +1 (right or up)
        short dir_y;

        friend class Game;

        int base_length = 3;    // base length of snake on start of the game
        const int length = Board::global_x * Board::global_y;   // max length
        int prev_tailPos[2];    // previous tail position (end of snake)
        int tail;               // tail is sum of base_length and score             
        int time = 100;         //  delay for snake

        struct Body{
            int body_pos[2]; // position of every element of snakes body
            Body* higherEl;  // point element nearer head element
        };
        Body* body = new Body[length];  // array for body of snake
};

С этим порядком все в порядке, но если я добавлю определение структуры Body и body поверх этого класса, вот так:

class Snake : public Fruit{
    private:
        struct Body{
            int body_pos[2]; // position of every element of snakes body
            Body* higherEl;  // point element nearer head element
        };
        Body* body = new Body[length];  // array for body of snake

        int head;
        short dir_x;    //-1 (left or down) / +1 (right or up)
        short dir_y;

        friend class Game;

        int base_length = 3;    // base length of snake on start of the game
        const int length = Board::global_x*Board::global_y; // max length
        int prev_tailPos[2];    // previous tail position (end of snake)
        int tail;               // tail is sum of base_length and score             
        int time = 100;         //  delay for snake
};

После остановки игры появляется эта ошибка:

> Unhandled Exception at 0x76C40860 (sechost.dll) in Snake.exe: 
> 0xC0000005: Access violation reading location 0x00000004`

Может кто-нибудь помочь мне, почему это проблема?

1 Ответ

3 голосов
/ 19 сентября 2019

Кажется, что во втором примере переменная length не определена во время оценки
Body* body = new Body[length];.

Это, скорее всего, ваша проблема.

Чтобы объяснить это немного дальше, вам нужно понять, что:
Порядок объявления переменных внутри класса / структурыважно .

Для иллюстрации:

class Data{
    int a = 10;
    int b = a;
};

В этом примере оба значения a и b будут равны 10.
Однако в случае, подобном этому:

class Data{
    int b = a;
    int a = 10;
};

a будет 10, а b будет иметь значение корзины.
Это потому, что при оценке int b = a;.a не определено.

...