我在类 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;
}
}
答案 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
{
...
}