我的对象在构造后立即被破坏

My object is being destructed right after being constructed

我正在尝试使用我创建的名为 Grid 的 class 构建一个二维布尔数组。 Grid 对象是另一个名为 GameOfLife 的 class 的私有成员 class。每当我使用参数 belove 创建 GameOfLife 对象时,Grid 对象首先使用默认构造函数创建,然后使用带参数的构造函数再次创建,然后由于某种原因 Grid 的解构函数运行并删除所有内容?我真的没有想法 :p 我是 运行 Eclipse Luna 上的 MinGW GCC。

Main.cpp

const int HEIGHT = 25;
const int WIDTH = 25;
#include <iostream>
#include "GameOfLife.h"

int main(int argc, const char * argv[]) {
    GameOfLife game = GameOfLife(HEIGHT, WIDTH, false);
    game.play();
    return 0;
}

Grid.h

#ifndef __Game_Of_Life__Grid__
#define __Game_Of_Life__Grid__

#include <stdio.h>

class Grid {
public:
    Grid(int y, int x, bool state);
    Grid();
    void allocate(int x, int y, bool state);
    void deallocate();
    void set(int x, int y, bool state);
    bool get(int x, int y);
    void setAll(bool state);
    void switchBoards();
    ~Grid();
private:
    bool ** oldGeneration;
    bool ** newGeneration;
    int height;
    int width;
};
#endif /* defined(__Game_Of_Life__Grid__) */

Grid.cpp

#include "Grid.h"

Grid::Grid(int y, int x, bool state) {
    allocate(x, y, state);
}
void Grid::allocate(int x, int y, bool state) {
    height = y;
    width = x;
    oldGeneration = new bool*[height];
    newGeneration = new bool*[height];
    for (int i = 0; i < height; i++) {
        oldGeneration[i] = new bool[width];
        newGeneration[i] = new bool[width];
    }
}
Grid::~Grid() {
    deallocate();
}
void Grid::switchBoards() {
    bool ** temp = oldGeneration;
    oldGeneration = newGeneration;
    newGeneration = temp;
    delete temp;
}  
bool Grid::get(int x, int y) {
    return oldGeneration[y][x];
} 
void Grid::set(int x, int y, bool state) {
    newGeneration[y][x] = state;
}  
void Grid::deallocate() {
    if (oldGeneration != NULL || newGeneration != NULL) {
        for (int i = 0; i < height; i++) {
                delete [] oldGeneration[i];
                delete [] newGeneration[i];
        }
        delete [] oldGeneration;
        delete [] newGeneration;
    }
    return;
}
Grid::Grid() {
    oldGeneration = NULL;
    newGeneration = NULL;
    width = 0;
    height = 0;
}
void Grid::setAll(bool state) {

    for (int i = 0; i < height; i++) {
        for (int n = 0; n < width; n++) {
            newGeneration[i][n] = state;
        }
    }
}

GameOfLife.h

#ifndef __Game_Of_Life__GameOfLife__
#define __Game_Of_Life__GameOfLife__

#include <stdio.h>
#include "Grid.h"
#include <iostream>


class GameOfLife {
private:
    Grid board;

public:

    GameOfLife(int y, int x, bool state);
    GameOfLife();
    ~GameOfLife();
    void play();
    void welcome();
    void makeBoard();
    void updateBoard();
    int findAliveNeighbours(int x, int y);
};

#endif /* defined(__Conway__GameOfLife__) */

GameOfLife.cpp

#include "GameOfLife.h"
const int WIDTH = 100;
const int HEIGHT= 75;



GameOfLife::GameOfLife(int y, int x, bool state) {
    board = Grid(y, x, state);

}
GameOfLife::GameOfLife() {
    board = Grid();
}

GameOfLife::~GameOfLife() {
    board.deallocate();
}
void GameOfLife::play() {

    welcome();
    makeBoard();

    for (int i = 0; i < HEIGHT; i++) {
        for (int n = 0; n < WIDTH; n++) {
            std::cout << board.get(n,i) << " ";
        }
        std::cout << std::endl;
    }
    updateBoard();
    std::cout << std::endl;
    for (int i = 0; i < HEIGHT; i++) {
        for (int n = 0; n < WIDTH; n++) {
            std::cout << board.get(n,i) << " ";
        }
        std::cout << std::endl;
    }

}
void GameOfLife::makeBoard() {
    int x1,x2,x3,x4, y1,y2,y3,y4;
    x1 = 10; y1 = 10;
    x2 = 10; y2 = 11;
    x3 = 10; y3 = 12;
    x4 = 11; y4 = 13;
    int x5 = 0; int y5 = 0;
    board.set(x1, y1, true);
    board.set(x2, y2, true);
    board.set(x3, y3, true);
    board.set(x4, y4, true);
    board.set(x5, y5, true);
}
void GameOfLife::welcome() {

        std::cout << "Welcome to Conway's Game Of Life"
                  << std::endl;
}
GameOfLife::GameOfLife(int y, int x, bool state) {

    // board is a member variable that gets initialized
    // with the default constructor.
    // Then it gets replaced by assignment with a different
    // Grid object. The temporary object gets deleted at
    // the end of the line.
    board = Grid(y, x, state);
}

将实施更改为:

GameOfLife::GameOfLife(int y, int x, bool state) : board(y, x, state) {}

同样,将默认构造函数更改为:

GameOfLife::GameOfLife() {}

需要修复的更重要的问题是您正在破坏 The Rule of Three

您需要在 Grid 中添加复制构造函数和复制赋值运算符的正确实现。

另一个更好的选择是将 Grid 的内部数据更改为

std::vector<std::vector<bool>> oldGeneration;
std::vector<std::vector<bool>> newGeneration;

那么,编译器生成的拷贝构造函数和拷贝赋值运算符就足够了。