【问题标题】:2D array of a class object call by reference通过引用调用类对象的二维数组
【发布时间】:2014-03-02 10:17:51
【问题描述】:

我在 stackoverflow 和 google 上搜索了很多,但没有我的情况。我想声明我的类框的二维数组。它工作正常,然后我需要一个打印功能。如果我在 main() 中打印了数组,那很好,但是现在有了打印机功能,我似乎遇到了很多错误。请帮我解决我的错误。

#include <iostream>

class box
{
private:
        char life;
public:
       box();
       void display();
       void input_alive();
       void input_dead();
};

box::box() 
{
   life = '0';
}

void box::display()
{
   std::cout << " " <<life <<" ";
}

void box::input_alive()
{
  life = '1';
}

void box::input_dead()
{
 life = '0';
}

void printer(box *array, int yy, int xx)
{
int i, j;
for(i=0; i<yy; i++) //PRINTER
{
   for(j=0; j<xx; j++)
   {
      array[i][j].display();
      if (j+1 == xx) //just newline for separate rows
         std::cout << std::endl;
   }
} 
}
int main()
{
int row=5, col=5;
box arr[row][col];
arr[3][4].input_alive();
arr[1][1].input_alive();

printer(arr, row, col);
return 0;
}

这种通过引用传递数组的语法在普通的 int/char 数组中工作得很好,但为什么不在这里呢。如果我将打印机功能放在 main 中,它可以正常工作:(。我必须使用 new 还是什么?或者我如何将 box 数组传递给函数?谢谢。

【问题讨论】:

  • 数组不是指针。

标签: c++ arrays class oop


【解决方案1】:

首先,C++ 不支持可变长度数组,因此您的代码不符合标准,因此不可移植。

其次,使用std::array可以避免所有的痛苦:

#include <array>

template <size_t ROWS, size_t COLS>
void printer(std::array<box, ROWS>, COLS>& arr)
{
  for(int i=0; i<ROW; ++i)
  {
    for(int j=0; j<COL; ++j)
    {
      // do something with arr[i][j]
    }
}

int main()
{
  const int row=5;
  const int col=5;
  std::array<std::array<box, row>, col> arr;
  arr[3][4].input_alive();
  arr[1][1].input_alive();

  printer(arr);
  return 0;
}

【讨论】:

  • 好的,但是可变长度数组是什么意思? arr[5][5] 不是常数吗?
  • @ShoaibHaider 你有box arr[row][col];,而且rowcol 都不是编译时常量。他们在我的例子中。
【解决方案2】:

您的解决方案是忘记原始数组。相反,您使用std::vectorstd::array 并使用operator() 编写一个Matrix 类,如C++ FAQ 中所述。另请参阅常见问题解答中的下一项,了解为什么您更喜欢(x, y) 表单而不是[x][y],但请考虑 喜欢后一种语法的优秀程序员(使用代理类),所以这个案例可能不像常见问题解答所说的那么清楚。

在任何情况下,您都需要一个具有std::vectorstd::array 实现的Matrix 类。原始数组不适用于此任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2018-06-25
    • 2020-06-29
    • 2021-03-24
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多