【问题标题】:2D Array of Pointers -> Classes2D 指针数组 -> 类
【发布时间】:2014-07-30 08:41:33
【问题描述】:

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

我创建了一个带有指针的二维数组,其中数组中的每个条目都是 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;
        }
}

【问题讨论】:

  • 你有一个指向 Organism 的指针数组,它们不指向任何东西。
  • 是的,如果没有为对象分配内存,-&gt; 运算符应该如何取消引用指针?
  • 我想我的问题是我没有完全理解指针。
  • @enochsoccer 一个指针告诉你在内存中可以找到其他东西的下落。这并不意味着任何形式的所有权。

标签: c++ arrays class constructor


【解决方案1】:

你有一个指向Organism指针数组。

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

您的数组的指针没有指向任何东西,这就是为什么当您尝试将数据分配给指针指向的位置时会出现未定义的行为

你需要为你的数组分配内存。

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.

相关:

【讨论】:

  • 好的,这更有意义,但现在,我收到错误:'grid' 的抽象类型'Organism' 无效
【解决方案2】:

改变

Organism* grid[20][20];

Organism  grid[20][20];

并使用

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

而不是

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

并为 Organism 添加一个默认构造函数

class Organism
{
   Organism();
   ...
}

或者让 Organism 成为一个结构

struct Oranism
{
 ...
}

【讨论】:

  • 现在,我收到错误:'grid' 的抽象类型'Organism' 无效
  • 我猜你应该为 Organism 添加一个默认构造函数或将其从类更改为结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
相关资源
最近更新 更多