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

时间:2013-09-02 16:34:06

标签: c++ arrays pointers

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

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

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

......我会这样使用......

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

......这样可以吗?

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

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果将数组分配为指向double的指针数组,然后将每行分配到第二级,那么就可以了。

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

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

答案 4 :(得分:0)

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

您还可以删除一个间接,但需要花费更多的索引计算开销。 2D数组也可以用一维数组表示,可以这样访问:

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

在这种情况下,Mats Petersson关于使用std::vector 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
}

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