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但是我通过调试器得到了未处理异常的错误
答案 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
。当您尝试拨打setNum
或setDenom
时,会导致异常。您可以通过为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
来消除分配。