下面的代码包含主文件,标题和.cpp文件。 运行代码时,屏幕上不显示任何内容。在构建它时,没有错误也没有警告。然而,运行它不会显示任何内容。
#include <iostream>
#include "Flight.h"
using namespace std;
int main()
{
Flight f (201, 8,6);
f.displaySeats();
return 0;
}
#ifndef FLIGHT_H
#define FLIGHT_H
class Flight {
public:
Flight( int fNo, int row, int col);
~Flight();
void setFlightNo( int no);
int getFlightNo();
void setSeats(int row, int col);
void initializeSeats();
char **getSeats();
void displaySeats();
private:
int flightNo;
char **seats;
int rows;
int cols;
};
#endif // FLIGHT_H
#include "Flight.h"
#include <iostream>
using namespace std;
Flight::Flight(int fNo, int row, int col)
{
setFlightNo(fNo);
setSeats(row, col);
initializeSeats();
rows = row;
cols = col;
}
Flight::~Flight()
{
}
void Flight::setFlightNo(int fNo) {
flightNo = fNo;
}
void Flight::setSeats(int rowNo, int colNo) {
seats = new char *[rowNo];
for (int i = 0; i < rowNo; i++) {
seats[i] = new char[colNo];
}
}
void Flight::initializeSeats() {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
seats[i][j] = 'o';
}
}
}
void Flight::displaySeats() {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << seats[i][j] << "\t";
}
cout << endl;
}
}
答案 0 :(得分:0)
在方法setSeats()中,您新建了一些数组,但在运行initializeSeats()之前没有设置行和列。因此,当您尝试使用它们时,数据属性行和列未初始化。未初始化的数据是未定义的行为。
建议使用ctor来初始化值。
我建议在initializeSeats()中添加一个assert(),这样编译器会告诉你你没有初始化行和列。
调试器帮我在90秒左右找到了这个。真的,学习gdb。你需要的是
b main - 在主
r - 运行程序,它将在第1个断点处停止
n - 下一个陈述的步骤
s - 进入下一个功能的步骤
p - 打印信息
尝试“p * this”,你会看到行和列未初始化,但是 你需要了解0是偶然的,不能保证。
(gdb)p * this
$ 7 = {flightNo = 201,seat = 0xeb49e1a454f09a00,rows = 0,cols = 0}
关于这个错误的另一个观点是选择了错误的初始化机制。我建议你使用更像:
Flight::Flight(int fNo, int row, int col) :
flightNo (fNo),
// stuff for seats later (why are you using arrays?)
rows (row),
sols (col)
{
setSeats(row, col); // this method does NOT seem to set anything
// perhaps a better name .. can you describe what
// the method does?
initializeSeats(); // by this invocation, rows and cols are set
}