如何在类函数中打印二维数组
How to print 2D array in a class function
所以我对类编程有些陌生,我不确定我的代码做错了什么,因为我试图打印一个二维数组,但在试图构建它时出现了错误
#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";
}
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 遍历二维数组的所有子数组
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 重载运算符后打印二维数组<<
- 按列打印二维数组时出现问题
- 使用 pthread 打印二维数组
- 打印空白,而不是二维数组c++中的整数
- 根据用户输入对二维数组进行排序和打印
- 如何在C++中打印二维数组
- 无法将二维数组中的数据打印到C++的输出文件
- 如何在类函数中打印二维数组
- 如何打印二维数组作为一个矢量