【问题标题】:C++ Implementing a copy constructorC++实现复制构造函数
【发布时间】:2012-08-24 04:46:00
【问题描述】:

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

这是我的代码:

//---------------------------------------------------------------------------

#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++ 构建器在编译此代码后崩溃。上面是否有任何不正确的内容会导致崩溃。没有编译错误,程序只是崩溃了。

【问题讨论】:

  • 使用调试器,因为在你这样做之前缺乏研究工作而被否决。
  • 你为什么要在类中创建一个包含 4 个指针的数组,为构造函数中的第一个分配 4 个新的 Wheels,然后迭代最初的 4 个?如果您总是想要四个轮子,只需使用std::array&lt;Wheel, 4&gt;。无需在任何地方进行动态分配。
  • 您没有 Wheel 类的复制 c-tor 和赋值运算符,如果您使用指针,在大多数情况下这是不正确的。如果您使用 C++ 编写,为什么不使用 std::vector?
  • ptrSize 看起来也是一个普通的 int 的主要候选人。

标签: c++ crash deep-copy


【解决方案1】:

根据我的经验,一般来说,如果我的编译器/工具崩溃,我可能做错了什么,以至于编译器编写者从未想过要检查它。

追踪此类事情的最佳方法是注释掉代码直到它再次工作,然后慢慢地把东西带回来,直到找到有问题的部分。

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

【讨论】:

  • 我想说至少通过使用调试器找出它在哪里要快得多。我从一个过渡到另一个的那一天是美好的一天。
  • @chris - 如果编译器崩溃,他应该怎么做?调试编译器?
  • 哦,我没有注意到关于 compiler 崩溃的部分。不过,我高度怀疑这就是真正的意思。我怀疑这只是由于错误的指针使用而导致程序崩溃。
  • @chris - 我认为您没有阅读 OQ 中的最后一段(在代码之后,很容易错过)。他说得很清楚,是他的构建器工具崩溃了,而不是他的实际程序。
  • 我读过它,但它似乎更有可能是用词错误而不是崩溃而不是正在编译的程序。
【解决方案2】:

问题是:

Wheel *carWheels[4];

*carWheels = new Wheel[4];

这只会为carWheels[0] 分配 4 个轮子。随着

return *carWheels[id];

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 2012-02-15
    • 2011-06-09
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多