我有一个程序,其中对象数组的大小在运行时确定,因此它是动态分配的(2D数组,从文件中读取)。我也有一个函数,它把这些对象作为参数。问题是,如果函数参数是传递给函数的二维数组,则应该确定第二维。然而,在我的情况下,它不是。我的程序不会编译,因为原型没有提到的第二次元。
这是我尝试的:
//global variables
int residentCount=0;
int hospitalCount=0;
Resident** residents;
Hospital** hospitals;
bool readFromFiles(const string, const string, const int); //sizes are determined in here
void print(Hospital*[hospitalCount], Resident*[residentCount]); //declaration issue
我该如何解决这个问题?
- 在可能的情况下,避免动态分配和自己处理内存管理
- 利用具有自动存储持续时间的对象,而是遵循RAII习惯用法
- 避免使用C风格的数组,实际上避免编写只能作为c++编译的C代码
- 使用c++提供的强大功能,特别是那些捆绑在STL 中的功能。
- 当本地变量足够时避免使用全局变量
应该是这样的:
typedef std::vector<Resident> Residents;
typedef std::vector<Hospital> Hospitals;
// passing by const reference:
void print(const std::vector<Hospitals>&, const std::vector<Residents>&);
int main()
{
std::vector<Hospitals> hospitals;
std::vector<Residents> residents;
...
} // <-- lifetime of automatics declared within main ends here
注意,hospitals
和residents
将是具有自动存储持续时间的对象,其使用方式与c风格的2D数组类似。当执行超出main
的作用域时,这些向量被销毁,并且内存中它们之前所在的元素(包括它们元素的元素)被自动清除。
还请注意,我建议您通过const引用传递,即const std::vector<Hospitals>&
,它可以防止创建传递对象的副本,并且const
关键字显式地告诉调用者:"虽然您通过引用传递此对象,但我不会更改它。"
只需传递一个指向数组的第一个元素和维度的指针,这就足够了,例如:
void PrintHospitals(Hospital* Hospitals, size_t HospitalRows, size_t HospitalColumns)
{
size_t i, j;
Hospital* hospital;
for (i = 0; i < HospitalRows; i++)
for (j = 0; j < HospitalColumns; j++)
{
hospital = Hospitals + HospitalColumns * i + j;
PrintHospital(hospital);
}
}
int main()
{
Hospital hospitals[10][20];
// ...
PrintHospitals(&hospitals[0][0], 10, 20);
return 0;
}
下面是使用模板为现有数据创建二维数组包装器的解决方案:
template<typename T>
class Array2d {
public:
int Rows;
int Cols;
T** Data;
Array2d(int rows, int cols, T** data) :
Rows(rows),
Cols(cols),
Data(data) { }
};
void print(Array2d<Hospital> h, Array2d<Resident> r) {
for (int i = 0; i < h.Rows; i++) {
for (int j = 0; j < h.Cols; j++) {
//Print Data[i][j] element here
}
}
// Other print code
}
int main()
{
Resident** residents;
Hospital** hospitals;
//Init data arrays
Array2d<Hospital> h(10, 10, hospitals);
Array2d<Resident> r(10, 10, residents);
print(h, r);
}