使用从成员函数返回的数组,这样可以吗

Using an array returned from a member function, is this ok?

本文关键字:数组 成员 函数 返回      更新时间:2023-10-16

只是想知道我是否能得到一些关于我正在做的事情的反馈,以及这是否是糟糕的juju。

我有一个成员函数,它返回一个2D数组(双间接指针),看起来像。。。

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

我会用这样…

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

这样可以吗?

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

如果你只想像一样使用它

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

您最好在ClassName 中提供一个getter

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

很明显像一样呼叫

if (my_class_object.GetValue(i, j) == 1)

是的,但要小心处理超出范围的错误。以及不良访问。

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

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

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

使用std::vector<std::vector<double>>& GetArr()将使其更加简单和安全。

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

您还可以删除一个间接寻址,但代价是增加一点索引计算开销。2D阵列也可以用1D阵列表示,1D阵列可以这样访问:

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

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

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
}

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