未处理的异常,传递对象?

时间:2013-05-23 09:57:47

标签: c++ class pointers dynamic

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但是我通过调试器得到了未处理异常的错误

2 个答案:

答案 0 :(得分:2)

在以下构造函数中,您尚未为radius

分配任何内容
Circle::Circle(Fraction& arg1) {
    radius->setNum(arg1.getNum());
    radius->setDenom(arg1.getDenom());
}

有不同的选项,但如果您想在Fraction中获得Circle的副本,则可以执行以下操作:

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传递的{{1}}不会被更改。

答案 1 :(得分:1)

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

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来消除分配。