如何在类函数中打印二维数组

How to print 2D array in a class function

本文关键字:打印 二维数组 类函数      更新时间:2023-10-16

所以我对类编程有些陌生,我不确定我的代码做错了什么,因为我试图打印一个二维数组,但在试图构建它时出现了错误

#include <iostream>
using namespace std;
class PlaneSeats
{
private:
    char seatAvailability[7][4];
public:
    PlaneSeats();
    void displayAvailability();
};
PlaneSeats::PlaneSeats()
{
    seatAvailability[7][4] = {{'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'}};
}
void PlaneSeats::displayAvailability()
{
    cout << row+1 << " ";
    for (int column = 0; column<4; column++)
    {
        cout << seatAvailability[row][column] << " ";
    }
    cout << endl;
}
int main()
{
    PlaneSeats plane;
    plane.displayAvailability();
    return 0;
}

构建时出现的错误有:

'row' was not declared in this scope    line 27
Symbol 'row' could not be resolved    line 27
Symbol 'row' could not be resolved    line 30
Multiple markers at this line    line 22
    - cannot convert '<brace-enclosed initializer list>' to 'char' in assignment
    - extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by
    default]

我大部分同意Blake的评估,但我认为OP对displayAvailability的意图更像这样:

void PlaneSeats::displayAvailability()
{
    for (int row = 0; row<7; row++)
    {
        cout << row+1 << " ";
        for (int column = 0; column<4; column++)
        {
            cout << seatAvailability[row][column] << " ";
        }
        cout << endl;
    }
}

对于列的打印周围的行,具有附加的for循环。

接下来,OP不能在构造函数中进行静态初始化,至少不能这样,但多亏了现代C++的奇迹,他们可以做到这一点:

class PlaneSeats
{
private:
    char seatAvailability[7][4] =
    {
        {'A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D'}
    };
public:
    PlaneSeats();
    void displayAvailability();
};

但是请注意,OP声明了一个由7行组成的数组,并且只为其中的6行赋值。这不太可能崩溃,因为数组条目已经分配,但冒险进入未定义的行为,没有人知道结果会在那些未初始化的插槽中放置什么值。

现在开始唠叨。

使用7和4作为原始数字是不必要的风险。它们作为命名常数值要安全得多。为什么?因为如果所有使用都引用相同的值,那么只需要对常量进行一次代码更改,就可以更改数组的大小。这也可以防止出现相反的情况,忘记更改至少一个值。你要么试图在数组的边界之外打印,很可能会崩溃,要么打印得太少

这稍微改变了类定义:

class PlaneSeats
{
private:
    static constexpr int numrows = 7;
    static constexpr int numcols = 4;
    char seatAvailability[numrows][numcols] =
    {
        {'A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D'}
    };
public:
    PlaneSeats();
    void displayAvailability();
};

显示可用性的类似更改

void PlaneSeats::displayAvailability()
{
    for (int row = 0; row<numrows; row++)
    {
        cout << row+1 << " ";
        for (int column = 0; column<numcols; column++)
        {
            cout << seatAvailability[row][column] << " ";
        }
        cout << endl;
    }
}

这也使代码的读取效果更好,因为7只是一个数字,numrows包含一些上下文提示。

当然,每个人最喜欢的唠叨是:为什么;使用命名空间std";被认为是不好的做法?

'row' was not declared in this scope    line 28

行和列的声明在哪里?您需要:

private:
int row;
int column;

在类中,然后在构造函数或使用它们的函数中初始化它们。

PlaneSeats::PlaneSeats()
{
    seatAvailability[7][4] = {{'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'},
                   {'A', 'B', 'C', 'D'}};
}

不能像这样初始化。您必须手动初始化每个维度。

什么是row?局部变量,成员?未声明。(并且只有6行被初始化。(尝试这样迭代数组:

static const int NUM_ROW = 7;
static const int NUM_COL = 4;
char seatAvailability[NUM_ROW][NUM_COL];
/* .. */
    for( int row = 0; row < NUM_ROW; ++row )
    {
        for( int col = 0; col < NUM_COL; ++col )
        {
            std::cout << "t" << seatAvailability[row][col];
        }
        std::cout << std::endl;
    }

稍后尝试一个动态数组,例如:

std::vector< char > seats( NUM_ROW * NUM_COL, 0 );

它不能以seats[row][col]的方式访问,而是以seats[col+NUM_COL*row]的方式访问。然而,相对于静态数组,它也有自己的优势。

数组基础:只有在声明数组变量时,大括号初始值设定项才可用。所以你不能按自己的方式去做。

因此,如果值早知道的话,最好在声明时赋值。

点击此链接:修改代码

在不知道向量长度的情况下,使用向量并在元素中迭代打印它的最佳方法如下所示:

    vector<vector<int>> mat {{11, 12, 13},{21, 22, 23},{31, 32, 33}};
for(auto line : mat)
{
    for(auto element : line)
    {
        cout<<element<< " ";
        }
   cout<<"n";
 }