【问题标题】:Multidimensional array of object in C++ , I can not initialize it!C++ 中的多维对象数组,我无法初始化它!
【发布时间】:2010-08-25 11:26:51
【问题描述】:

菜鸟 C++ 程序员又来了

我正在使用 VC++ VS2008 并尝试创建一个数组数组。我想存储的所有对象都放在堆上。

在数组中,它只是指针。

这里有一些代码:

网格.h

#include "Tile.h"

class Grid
{
public: 
    Tile* grid_ptr[8][8];
...
...
};

Grid.cpp

#include "stdafx.h"
#include "Grid.h"

...
...
void Grid::Initialize()
{
    for(int i = 0; i < 8; i++)
    {
        Grid::grid_ptr[i][0] = new Tile::Tile(10,10);
        for (int j = 0; j < 8; j++)
        {
            Grid::grid_ptr[i][j] = new Tile::Tile(10,10);
        }

    }
}
...
...
}

一切都很好,包括瓷砖结构。这似乎是一个语法错误,因为编译器给了我这个

错误 1 ​​错误 C2061:语法错误:标识符“{ctor}”

错误 2 错误 C2061:语法错误:标识符“{ctor}”

始终是同一个故事。不幸的是,这让我的整个工作陷入了停顿,我非常感谢对此的解决方案。

简而言之。如何正确创建一个大小为 8x8 的数组,其中填充了引用其各自 tile 对象的指针?

这样使用内存是否可行或明智?

请注意,我确实阅读了很多关于此的示例,并且使用整数或其他数据类型这样做是成功的。然而,这根本不是我想要分配的

此处为 Tile.h,下方为 Tile.cpp

class Tile
{       
public:

private:
    enum TileOccupation
    {
        EmptyTile = 0,
        WhiteSphere = 1,
        BlackSphere = 2
    };

    unsigned short horizontalDimensions;
    unsigned short verticalDimensions;

public:
    Tile();
    Tile(unsigned short horizontalDimensions, unsigned short verticalDimensions);
    ~Tile();

void Update();
void Draw();


};

> Tile.cpp

#include "stdafx.h"
#include "Tile.h"

Tile::Tile()
{

}

Tile::Tile(unsigned short horizontalDimensions, unsigned short verticalDimensions)
{

}

void Tile::Update()
{

}

void Tile::Draw()
{

}

【问题讨论】:

  • new Tile::Tile(10,10) -> new Tile(10,10);
  • 你能告诉我们Tile构造函数吗?
  • 您的 Grid::Initialize 代码按原样泄漏了八个 Tile 对象:grid_ptr[i][0] 两次获得一个新的对象。只需删除 Grid::grid_ptr[i][0] = new Tile::Tile(10,10); 行即可解决此问题。
  • 它现在在帖子中。希望对你有帮助
  • 你的 for 循环写得像这样,你也有一些内存泄漏。例如。对于 i = 0,您在 [0][0] 处分配新的 Tile 指针并将其放入数组中,然后 j 索引 for 循环将为 [0][0] 位置分配另一个 Tile 指针 - Q 前一个会发生什么瓷砖指针? - A 它泄漏; [1][0]、[2][0] 等也会发生这种情况。

标签: c++ arrays pointers object multidimensional-array


【解决方案1】:

您不想创建Tile::Tile(构造函数),而是想创建Tile(对象)- 将new Tile::Tile 更改为new Tile

此外还有泄漏。删除这个:

Grid::grid_ptr[i][0] = new Tile::Tile(10,10);

// 编辑

您可能对动态数组(我们在维度未知时使用的数组)感到困惑。您的阵列是静态的(展位尺寸),您不必为它动态分配内存。它是您的类的一部分,并使用对象自动创建,就像例如简单的int 字段。

还有一个。考虑是否真的必须动态创建图块。你会把瓷砖移入和移出阵列吗? Tile 比 int 大吗?如果任何问题的答案都是“否”,那么静态分配对您来说就可以了:

Tile grid_ptr[8][8];

【讨论】:

  • 是的,我还没有专注于删除它,但我知道谢谢。你能向我解释一下使用这个范围运算符的区别吗?
  • 哇......错误消失了......编译器错误报告器中的空白。谢谢 !现在对于学习方面,我做错了什么? (是清理c的内存泄漏)
  • Tile::Tile 是一个构造函数。 new 运算符不需要构造函数,它需要您要创建的对象类型(类型为Tile)。构造函数总是被自动调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多