我有一个大型代码库,最初是 C 多年前移植到 C++ 的,它正在对许多大型空间数据数组进行操作。这些数组包含表示表示表面模型的点和三角形实体的结构。我需要重构代码,以便这些实体在内部存储的特定方式因特定场景而异。例如,如果点位于规则的平面网格上,我不需要存储 X 和 Y 坐标,因为它们可以动态计算,三角形也可以。同样,我想利用STXXL等核心工具进行存储。最简单的方法是用 put 和 get 类型函数替换数组访问,例如
point[i].x = XV;
变成
Point p = GetPoint(i);
p.x = XV;
PutPoint(i,p);
可以想象,这是对大型代码库的非常繁琐的重构,在途中容易出现各种错误。我想做的是编写一个通过重载 [] 运算符来模仿数组的类。由于数组已经存在于堆上,并且随着 reallocs 移动,代码已经假设对数组的引用,例如
point *p = point + i;
可能无法使用。这个类可以写吗?例如,根据 [] 运算符编写以下方法;
void MyClass::PutPoint(int Index, Point p)
{
if (m_StorageStrategy == RegularGrid)
{
int xoffs,yoffs;
ComputeGridFromIndex(Index,xoffs,yoffs);
StoreGridPoint(xoffs,yoffs,p.z);
} else
m_PointArray[Index] = p;
}
}
Point MyClass::GetPoint(int Index)
{
if (m_StorageStrategy == RegularGrid)
{
int xoffs,yoffs;
ComputeGridFromIndex(Index,xoffs,yoffs);
return GetGridPoint(xoffs,yoffs); // GetGridPoint returns Point
} else
return m_PointArray[Index];
}
}
我担心的是我见过的所有数组类都倾向于通过引用传递,而我认为我必须通过值传递结构。我认为它应该在性能之外起作用,任何人都可以看到这种方法的任何主要缺陷。nb 我必须按值传递的原因是为了得到
point[a].z = point[b].z + point[c].z
在底层存储类型不同的情况下正常工作。