2

我有一个程序,其中对象数组的大小是在运行时确定的,因此它是动态分配的(二维数组,从文件中读取)。我还有一个将这些对象作为参数的函数。问题是如果函数参数是传递给函数的二维数组,则应确定第二维。但是,就我而言,事实并非如此。我的程序无法编译,因为原型没有提到第二维。

这是我尝试过的:

//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

我该如何解决这个问题?

4

3 回答 3

4
您正在使用 C++ 编程,因此您应该:
  • 尽可能避免动态分配和自行处理内存管理
  • 避免使用 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

请注意hospitalsresidents将是具有自动存储持续时间的对象,其使用方式与您的 C 样式 2D 数组类似。当执行超出 的范围时main,这些向量将被破坏并自动清理其元素(包括其元素的元素)之前所在的内存。

另请注意,我建议您通过 const 引用传递,即const std::vector<Hospitals>&,这可以防止创建传递对象的副本,并且const关键字明确告诉调用者:“尽管您通过引用传递此对象,但我不会更改它。”

于 2013-03-22T16:19:57.843 回答
3

只需将指针传递给数组的第一个元素和维度,就足够了,例如:

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;
}
于 2013-03-22T16:07:57.830 回答
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);
}
于 2013-03-22T16:45:28.863 回答