1

只是想知道我是否能得到一些关于我在做什么以及它是否是坏 juju 的反馈。

我有一个返回二维数组(双间接指针)的成员函数,它看起来像......

int** ClassName::GetArr() const
{
   return arr;
}

...我会使用就像这样...

if (my_class_object.GetArr()[i][j] == 1) // do something

...这个可以吗?

(是的,我可能应该使用矢量,但问题仍然存在!)

4

5 回答 5

2

如果您只想像这样使用它

if (my_class_object.GetArr()[i][j] == 1)

你可能会更好地提供一个吸气剂ClassName

int ClassName::GetValue(int i, int j) const
{
    //possible error checking
    return arr[i][j];
}

显然是这样打电话的

if (my_class_object.GetValue(i, j) == 1)
于 2013-09-02T16:43:44.553 回答
1

是的,但要小心超出范围的错误。和不好的访问。

于 2013-09-02T16:35:56.083 回答
0

是的,只要arr分配了内存并正确初始化/设置,那应该没问题。

于 2013-09-02T16:37:02.603 回答
0

如果将数组分配为指向 double 的指针数组,然后将每一行分配到第二级,那就没问题了。

如果数组在两个维度上都没有完全分配,它不太可能按预期工作,并且当您尝试访问数组时会发生“奇怪的事情”。

使用std::vector<std::vector<double>>& GetArr()会使它更简单、更安全。

于 2013-09-02T16:42:52.377 回答
0

与使用指针一样,您必须确保您实际访问的是有效的内存位置。

您还可以以增加索引计算开销为代价删除一个间接。2D 数组也可以用 1D 数组表示,可以像这样访问:

my_class_object.GetArr()[i * height + j]

在这种情况下,Mats Petersson 的使用 a std::vectorof std::vectors 的建议可以简化为单个向量:

const std::vector<int>& ClassName::GetArr() const // assuming read-only access
{
  return arr;
}

无论您做什么,使用下标运算符也可能触发访问冲突,因为它本质上与访问指向无效存储的 C 数组具有相同的效果。

但是,很容易保护自己免受这种影响:

size_t index                = i * height + j;
const std::vector<int>& vec = my_class_object.GetArr();
if(index < vec.size())
{
    // do stuff using the value at the calculated index
}

编辑:为了避免混淆,索引 i 和 j 需要分别位于 [0, HEIGHT( 和 [0, WIDTH( ,其中高度和宽度是 y 和 x 中数组的维度。

于 2013-09-02T16:48:56.343 回答