如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?



我的主机游戏引擎有一个类,它有一个用于地图的字符数组。在构造函数中,我想获取地图高度和宽度的参数(地图是一个数组(。我试图在构造函数中声明并实例化一个数组,但是在构造函数完成构造后,该数组将被删除。它看起来像这样:

class ConsoleGameEngine {
public:
ConsoleGameEngine(mapheight, mapwidth) {
char map[mapheight][mapwidth];
}
}

这不允许任何其他方法访问 map 数组,因为它在构造函数完成时被销毁。我想做这样的事情:

class ConsoleGameEngine {
public:
char map;
ConsoleGameEngine(mapheight, mapwidth) {
map[mapheight][mapwidth];
}
}

我不想使用向量,我想使用普通数组。感谢您的阅读。

这是不可能的。数组必须具有 C++ 的编译时常量大小。请参阅此问题以了解原因。您可以动态分配它,但您必须管理可能会变得复杂的内存。std::vector可能是最好的选择,您可以通过将 2D 索引映射到 1D 索引来使用 1D

向量,这比向量向量更有效。

您可以使用模板。这些参数在编译时是已知的,因此您可以使用它们来定义数组的维度:

#include <iostream>
#include <cstdlib>
template < int nRows, int nCols>
class MyFunArray
{
public:
int m_nRows = nRows;
int m_nCols = nCols;
char map[nRows][nCols];
bool SetValue(char val, int row, int col)
{ if (row >= 0 && row < m_nRows && col >= 0  && col < m_nCols)
{   map[row][col] = val;
return true;
}
return false;
}
char GetValue(int row, int col)
{ if (row >= 0 && row < m_nRows && col >= 0  && col < m_nCols)
return map[row][col];
else
return '';
}
};

int main()
{
MyFunArray<3,4> myArr;
myArr.SetValue('b', 1,2);
std::cout << myArr.GetValue(1,2) << std::endl;
}

我添加了 Set/Get 函数,只是为了对绑定限制进行编码。如果你觉得勇敢(和不负责任(,你可以直接访问map

只是对@AlexanderZhang答案的补充。

最不坏的方法是使用底层 1D 向量,它将为您处理动态内存管理。但不幸的是,C++不支持任何接近多D容器的东西。

这是我解释这个问题的一个老问题,NicolBolas给出了非常详细的答案

无论如何,你会发现我在代码审查中提交的一个实现尝试 - 这是第三次尝试,你会看到试图在多D数组上模仿标准容器很快就会导致一些复杂性......

相关内容

最新更新