gpt4 book ai didi

c++ - 我的 park_car 功能有什么问题?

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:07 25 4
gpt4 key购买 nike

我又在做一个学校的任务,我正在慢慢地实现它,我不知道为什么我的park_car功能不起作用,我只是想做一个测试和程序崩溃……这是我的代码。

PS:我无法更改 ***p2parkboxes,因为它像大多数其他变量一样在起始文件中给出。我只想将 0 楼的第一个元素视为:HH-AB 1234。非常感谢您的帮助。PS2:我也不能使用 std::string ,因为它不允许用于该任务。

#include <iostream>
#include <cstring>
using namespace std;

#define EMPTY "----------"
class Parkbox{
char *license_plate; // car's license plate
public:
Parkbox(char *s = EMPTY); // CTOR
~Parkbox(); // DTOR
char *get_plate(){return license_plate;}
};
class ParkingGarage{
Parkbox ***p2parkboxes;
//int dimensions_of_parkhouse[3]; // better with rows,columns,floors
int rows,columns,floors; // dimensions of park house
int total_num_of_cars_currently_parked;
int next_free_parking_position[3];
// PRIVATE MEMBER FUNCTION
void find_next_free_parking_position();
public:
ParkingGarage(int row, int col, int flr);// CTOR,[rows][columns][floors]
~ParkingGarage(); // DTOR
bool park_car(char*); // park car with license plate
bool fetch_car(char*); // fetch car with license plate
void show(); // show content of garage floor
// by floor
};

Parkbox::Parkbox(char *s ) { // CTOR
license_plate = new char[strlen(s)+1];
strcpy(license_plate, s);
//cout << "ParkBox CTOR" << endl;
}
Parkbox::~Parkbox() { // DTOR
delete [] license_plate;
//cout << "ParkBox DTOR" << endl;
}

ParkingGarage::ParkingGarage(int row, int col, int flr){
rows = row; columns = col; floors = flr;
p2parkboxes = new Parkbox**[row];
for (int i = 0; i < row; ++i) {
p2parkboxes[i] = new Parkbox*[col];

for (int j = 0; j < col; ++j)
p2parkboxes[i][j] = new Parkbox[flr];
}

}

ParkingGarage::~ParkingGarage(){

for (int i = 0; i < rows; ++i) {
for (int j = 0; j < columns; ++j)
delete [] p2parkboxes[i][j];

delete [] p2parkboxes[i];
}
delete [] p2parkboxes;
}

void ParkingGarage::show(){
int i,j,k;
for (i = 0 ; i < floors; i++){
cout << "Floor" << i << endl;
for (j=0;j<rows;j++){
for (k=0;k<columns;k++){
cout << p2parkboxes[j][k][i].get_plate() << " ";
}
cout << endl;
}
}
}

bool ParkingGarage::park_car(char*s){

p2parkboxes[0][0][0] = Parkbox(s); //test
//p2parkboxes[0][0][0] = s; //test

return true;
}


int main(void) {
// a parking garage with 2 rows, 3 columns and 4 floors
ParkingGarage pg1(2, 3, 4);
pg1.park_car("HH-AB 1234");
/*pg1.park_car("HH-CD 5678");
pg1.park_car("HH-EF 1010");
pg1.park_car("HH-GH 1235");
pg1.park_car("HH-IJ 5676");
pg1.park_car("HH-LM 1017");
pg1.park_car("HH-MN 1111"); */
pg1.show();
/*pg1.fetch_car("HH-CD 5678");
pg1.show();
pg1.fetch_car("HH-IJ 5676");
pg1.show();
pg1.park_car("HH-SK 1087");
pg1.show();
pg1.park_car("SE-AB 1000");
pg1.show();
pg1.park_car("PI-XY 9999");
pg1.show(); */
return 0;
}

最佳答案

您没有为 Parkbox 类声明复制构造函数。所以,这条线

p2parboxes[0][0][0] = Parkbox(s)

在堆栈上创建一些东西(带有 char* 指针的 Parkbox 实例)(并几乎立即删除它)。要更正此问题,您可以定义

Parkbox& operator = Parkbox(const Parkbox& other)
{
license_plate = new char[strlen(other.get_plate())+1];
strcpy(license_plate, other.get_plate());
return *this;
}

让我们看看

的工作流程
p2parboxes[0][0][0] = Parkbox(s)

行。

  1. 首先,调用构造函数并在堆栈上创建一个 Parkbox 实例(我们将其称为 tmp_Parkbox)。
  2. 在此构造函数中分配了 license_plate,假设它指向 0xDEADBEEF 位置。
  3. 发生了复制(这很明显,因为this 是用代码编写的东西)并且 p2parboxes[0][0][0] 现在包含 tmp_Parkbox 的精确拷贝。<
  4. tmp_Parkbox 的作用域现在结束,tmp_Parkbox 的析构函数被调用,其中 tmp_Parkbox.license_plate (0xDEADBEEF ptr) 被释放。
  5. p2parboxes[0][0][0] 仍然包含 Parkbox 的“有效”实例并且 p2parboxes[0][0][0].license_plate 仍然是 0xDEADBEEF,这会导致未定义的行为,如果任何分配都发生在您调用

    cout << p2parboxes[0][0][0].license_plate;

底线:该行本身没有任何问题,问题隐藏在“=”运算符的实现细节中。

在这一点上,对字符串使用 std::string 确实更好,而不是混合了隐式 C++ 复制/构造语义的锋利、棘手和显式的 C 风格直接内存管理。如果将 std::vector 用于动态数组,代码也会更好。

关于c++ - 我的 park_car 功能有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10678165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com