只是想知道我是否能得到一些关于我正在做什么以及它是否是坏juju的反馈。
我有一个返回2D数组(双间接指针)的成员函数,它看起来像......
int** ClassName::GetArr() const
{
return arr;
}
......我会这样使用......
if (my_class_object.GetArr()[i][j] == 1) // do something
......这样可以吗?
(是的,我应该使用矢量,但问题仍然存在!)
答案 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。