2D指针阵列 - >类

时间:2014-07-30 08:41:33

标签: c++ arrays class constructor

我在类 World 中的构造函数出现问题。

我创建了一个带有指针的2D数组,其中数组中的每个条目都是 Organism 类型,因此代码行:

Organism* grid[20][20];

当我运行程序时,我只看到

hello

之后,我收到一条消息,说我的程序已停止工作。我很确定它是代码行

grid[i][j]->symbol = ' ';

导致问题的原因。只是为了看看会发生什么,我将该行更改为

grid[i][j];

并没有收到任何错误。但是,在我放 - > 的那一刻,我似乎得到了错误。

在我输入 - > 之后,我的程序是否有理由停止工作?任何帮助将不胜感激。

这是我的代码:

#include <iostream>

using namespace std;

class Organism
{
public: 
    char symbol;
};

class World
{
public:
    World();

private:
    Organism* grid[20][20];
};


int main()
{
    World world;
    return 0;
}


World::World()
{
    for(int i = 0; i < 20; i++)
        for(int j = 0; j < 20; j++)
        {
            cout << "hello" << endl;
            grid[i][j]->symbol = ' ';
            cout << "here" << endl;
        }
}

2 个答案:

答案 0 :(得分:0)

你有一个指针数组Organism

指针不能保存除地址以外的任何数据。它们只能指向内存(保存数据)。

您的数组指针不指向任何内容,这就是当您尝试将数据分配到指针指向的位置时,为什么会出现未定义的行为。 / p>

您需要为阵列分配内存。

Organism grid[20][20]; // Create an array of objects (not pointers).
/* ... */
grid[i][j].symbol = ' ';

使用动态内存

class World {
public:
    World();
    ~World();                                // Rule of Three.
    World(const World&) = delete;            // Rule of Three.
    World& operator=(const World&) = delete; // Rule of Three.
private:
    Organism** grid;
};

World::World() {
    grid = new Organism*[20]; // Allocate memory to point to.
    for(std::size_t i = 0; i != 20; ++i) {
        grid[i] = new Organism[20]; // Allocate memory to point to.
        for(std::size_t j = 0; j != 20; ++j) {
            cout << "hello" << endl;
            grid[i][j].symbol = ' ';
            cout << "here" << endl;
        }
    }
}

// Destructor needed to deallocate memory (otherwise it will leak).
World::~World()
{
    for (std::size_t i = 0; i != 20; ++i) {
        delete[] grid[i];
    }
    delete[] grid;
}

现在您可以看到使用动态内存时有多复杂,以及为什么建议您更喜欢使用自动存储持续时间(即创建对象,而不是指针和new / delete)。

更好的方法是使用标准库中的容器来存储您的元素,例如: std::vector

相关:

答案 1 :(得分:0)

更改

Organism* grid[20][20];

Organism  grid[20][20];

并使用

grid[i][j].symbol = '';

而不是

grid[i][j]->symbol = '';

并向Organism

添加默认构造函数
class Organism
{
   Organism();
   ...
}

或使Organism成为结构

struct Oranism
{
 ...
}