使用从成员函数返回的数组,这样可以吗
Using an array returned from a member function, is this ok?
只是想知道我是否能得到一些关于我正在做的事情的反馈,以及这是否是糟糕的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::vector
s的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中的维度。
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- C++ - 移动具有固定大小的 c 样式数组成员的类的构造函数
- C++内联数组成员统一初始化
- 有没有办法把字符串数组成员放在".structurevariable"前面?
- 将初始化列表传递给 C++ 中的数组成员
- 具有灵活数组成员的结构的大小
- 初始化固定的 C 数组成员结构
- 带有布尔数组成员的 C++ 结构.如何在主代码中使用
- 我如何通过构造函数大小私人std ::数组成员
- 通过两个下标访问数组成员
- size_t结构非数组成员崩溃的强制转换
- 删除数组成员的更好方法是什么?
- 从C 到C#调用INT []显示随机大数字,而不是原始数组成员
- 在C 中的数组初始化期间使用数组成员
- 友元函数将内存分配给数组成员是否有任何限制?
- 从结构传递数组成员会导致访问读取冲突
- 为什么 const char 数组成员的初始化在构造函数初始值设定项中不兼容
- 如何在 lambda 中访问数组成员
- 将整数值分配为variadic模板列表到静态const std ::数组成员