我正在编写一些代码来实现对象的深层副本。
这是我的代码:
//---------------------------------------------------------------------------
#pragma hdrstop
#include <tchar.h>
#include <string>
#include <iostream>
#include <sstream>
#include <conio.h>
using namespace std;
//---------------------------------------------------------------------------
class Wheel
{
public:
Wheel() : pressure(32)
{
ptrSize = new int(30);
}
Wheel(int s, int p) : pressure(p)
{
ptrSize = new int(s);
}
~Wheel()
{
delete ptrSize;
}
void pump(int amount)
{
pressure += amount;
}
int getSize()
{
return *ptrSize;
}
int getPressure()
{
return pressure;
}
private:
int *ptrSize;
int pressure;
};
class RacingCar
{
public:
RacingCar()
{
speed = 0;
*carWheels = new Wheel[4];
}
RacingCar(int s)
{
speed = s;
}
RacingCar(RacingCar &oldObject)
{
for ( int i = 0; i < sizeof(carWheels)/sizeof(carWheels[0]); ++i)
{
Wheel oldObjectWheel = oldObject.getWheel(i);
carWheels[i]=new Wheel(oldObjectWheel.getSize(),oldObjectWheel.getPressure());
}
}
void Accelerate()
{
speed = speed + 10;
}
Wheel getWheel(int id)
{
return *carWheels[id];
}
void printDetails()
{
cout << carWheels[0];
cout << carWheels[1];
cout << carWheels[2];
cout << carWheels[3];
}
private:
int speed;
Wheel *carWheels[4];
};
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
RacingCar testCar;
testCar.printDetails();
RacingCar newCar = testCar;
newCar.printDetails();
getch();
return 0;
}
//---------------------------------------------------------------------------
出于某种原因,我的C ++构建器在编译此代码后崩溃了。上面有什么不正确会导致崩溃。没有编译错误,程序崩溃了。
答案 0 :(得分:2)
问题是:
Wheel *carWheels[4];
和
*carWheels = new Wheel[4];
这只为carWheels[0]
分配4个轮子。与
return *carWheels[id];
如果id
不为0,则会导致未定义的行为,因为如前所述,只有第一个元素是有效指针。
除此之外,代码太可怕了。避免原始指针。在C ++中有更好的选择。使用std::vector
或std::array
您使用C-array的地方,以及使用原始数据的智能指针。
答案 1 :(得分:0)
一般来说,根据我的经验,如果我的编译器/工具崩溃了,我可能会做一些错误的事情,以至于编译器编写者甚至从未想过要检查它。
追踪此类内容的最佳方法是注释掉代码,直到它再次运行,然后慢慢将内容重新带回来,直到找到有问题的部分。
作为一个设计说明,我会说,如果是我,我也会为Wheel
实现一个复制构造函数,而不必为像{{1}这样的类编写复杂的深层复制构造函数使用它。