【问题标题】:Unhandled Exception,passing object?未处理的异常,传递对象?
【发布时间】:2013-05-18 15:11:51
【问题描述】:
class Fraction {
public:
    Fraction();
    Fraction(int);
    Fraction(int, int);
    ~Fraction();
    void setNum(int);
    void setDenom(int);
    int getNum(void) const;
    int getDenom(void) const;
    void print(void);
private:
    int num;
int denom;
};

class Circle {
public:
    Circle();
    Circle(Fraction& arg1);
   ~Circle();
    void print(void);
protected:
    Fraction *radius;
};

#include "Fraction.h"
#include "Circle.h"
#include <iostream>
using namespace std;

Fraction::Fraction() {
    num = 0;
    denom = 1;
}
Fraction::Fraction(int n, int d) {
    num = n;
    denom = d;
}
Fraction& Fraction::operator=(const Fraction& arg) {
    num = arg.num;
    denom = arg.denom; 
    return *this;
}
Fraction::~Fraction() {
}

//Circle

Circle::Circle() {
    radius->setNum(1);
    radius->setDenom(1);
}
Circle::Circle(Fraction& arg1) {
    radius->setNum(arg1.getNum());
    radius->setDenom(arg1.getDenom());
}
Circle::~Circle() {
     delete this->radius;
}

当我在 main() 中创建对象时,问题就来了

 Fraction* fPtr = new Fraction(4, 1);
 Circle* cPtrA = new Circle(*fPtr);

这两个都是类。 首先,我使用复制构造函数将 classFraction 的 Numerator 设置为 4,将 Denominator 设置为 1。

然后我想将 (4, 1) 传递到我的 classCircle 但我通过调试器收到未处理异常的错误

【问题讨论】:

  • 为什么radius是一个指针?

标签: c++ class pointers dynamic


【解决方案1】:

在下面的构造函数中,你没有给radius分配任何东西

Circle::Circle(Fraction& arg1) {
    radius->setNum(arg1.getNum());
    radius->setDenom(arg1.getDenom());
}

有不同的选择,但如果您想在Circle 中拥有Fraction 的副本,您可以这样做:

Circle::Circle(Fraction& arg1) : radius(new Fraction(arg1)) {
}

最好只存储对象的副本

class Circle {
public:
    Circle();
    Circle(const Fraction& arg1);
   ~Circle();
    void print(void);
protected:
    Fraction radius;
};

Circle::Circle(const Fraction& arg1) : radius(arg1)) {
}

请注意,通过将参数设置为 const 引用,您向编译器和其他用户表明传递的 Fraction 不会被调用更改。

【讨论】:

    【解决方案2】:

    您忘记在复制构造函数和默认构造函数中初始化radius。当您尝试调用setNumsetDenom 时,这会导致异常。您可以通过为radius 分配Fraction 来解决此问题,如下所示。

    Circle::Circle() : radius(new Fraction())
    {
        radius->setNum(1);
        radius->setDenom(1);
    }
    
    Circle::Circle(const Fraction &other) : radius(new Fraction())
    {
        radius->setNum(arg1.getNum());
        radius->setDenom(arg1.getDenom());
    }
    

    通常更喜欢通过复制构造来初始化radius

    Circle::Circle(const Fraction &other) : radius(new Fraction(other))
    {
    }
    

    记得删除析构函数中的对象。

    Circle::~Circle()
    {
        delete radius;
    }
    

    您可以通过按值而不是按指针存储radius 来消除分配。

    【讨论】:

      猜你喜欢
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多