C++实现复制构造函数

C++ Implementing a copy constructor

本文关键字:构造函数 复制 实现 C++      更新时间:2023-10-16

我正在编写一些代码来实现对象的深度副本。

这是我的代码:

//---------------------------------------------------------------------------
#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++构建器在编译完这段代码后崩溃了。上面有没有什么不正确的地方会导致这个崩溃。没有编译错误,程序只是崩溃了。

问题是:

Wheel *carWheels[4];

*carWheels = new Wheel[4];

这仅为CCD_ 1分配4个轮子。连同

return *carWheels[id];

如果id不为0,这将导致未定义的行为,因为如前所述,只有第一个元素是有效的指针。

除此之外,代码也很糟糕。避免使用原始指针。C++中有更好的替代方案。在使用C数组的地方使用std::vectorstd::array,在使用原始指针的地方使用智能指针。

一般来说,根据我的经验,如果我的编译器/工具崩溃,我可能会做一些错误的事情,以至于编译器编写人员从未想过要检查它。

追踪这些事情的最好方法是注释掉代码,直到它再次工作,然后慢慢地把东西放回原处,直到你找到冒犯的部分。

作为设计说明,我想说,如果是我,我也会为Wheel实现一个复制构造函数,而不必为使用它的RacingCar等类编写复杂的深度复制构造函数