以下是3个班级。分数/矩形/盒
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 Rectangle {
public:
FinalRectangleRavuthL();
~FinalRectangleRavuthL();
FinalRectangleRavuthL(Fraction&, Fraction&);
void setLen(Fraction arg);
void setWid(Fraction arg);
Fraction getLen(void) const;
Fraction getWid(void) const;
friend ostream& operator<<(ostream&, Rectangle&);
private:
Fraction *len;
Fraction *wid;
};
class Box : public Rectangle {
public:
Box();
FinalBoxRavuthL(Rectangle& arg, Fraction& arg1);
FinalBoxRavuthL(Fraction& arg);
void print(void);
void getBox(void);
~FinalBoxRavuthL();
private:
Fraction *height;
};
//程序
#include "Fraction.h"
#include "Circle.h"
#include "Box.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() {
}
//Rectangle
Rectangle::Rectangle() {
*len = FinalFractionRavuthL(2);
*wid = FinalFractionRavuthL(1);
}
Rectangle::RectangleFraction& frac, Fraction& frac1) {
cout << "First Fraction : ";
frac.print();
cout << "Second Fraction : ";
frac1.print();
}
void Rectangle::setLen(Fraction arg) {
len->setNum(arg.getNum());
len->setDenom(arg.getDenom());
}
void Rectangle::setWid(Fraction arg) {
wid->setNum(arg.getNum());
wid->setDenom(arg.getDenom());
}
Fraction Rectangle::getLen(void) const {
return Fraction(len->getNum(), len->getDenom());
}
Fraction Rectangle::getWid(void) const {
return Fraction(wid->getNum(), wid->getDenom());
}
Rectangle::~Rectangle() {
delete this->len;
delete this->wid;
}
//Box
Box::Box() : height(new Fraction())
{
height->setNum(0);
height->setDenom(0);
}
Box::Box(Rectangle& arg, Fraction& arg1) : height(new Fraction())
{
arg.getLen().print();
arg.getWid().print();
cout << arg1.getNum();
cout << arg1.getDenom();
}
Box::Box(Fractio& arg) {
height->setNum(arg.getNum());
height->setDenom(arg.getDenom());
}
Box::~Box() {
delete this->height;
}
当我在主
中调用此问题时,会出现问题Fraction* fPtrA = new Fraction(4, 1);
Rectangle* rPtrA = new Rectangle(*fPtrA, *fPtrA);
Fraction* fPtrD = new Fraction(9, 1);
BoxRavuthL* boxPtrA = new Box(*rPtrA, *fPtrD); //PROBLEM
我将两个分数fPtrA放入类Rectangle中以制作一个矩形 我创建另一个分数
然后我将Rectangle和分数传递给Box
我知道问题与我制作的默认构造函数有关。请帮忙 :) 我知道我可以使用普通会员数据
答案 0 :(得分:0)
一个问题是Rectangle
的构造函数在初始化之前解除引用Fraction
指针,导致未定义的行为。
// len and wid have not been initialized and point to random points in memory
Rectangle::Rectangle()
{
*len = FinalFractionRavuthL(2);
*wid = FinalFractionRavuthL(1);
}
您需要为Fraction
和len
创建一个wid
对象。
Rectangle::Rectangle()
: len(new Fraction()), wid(new Fraction())
{
*len = FinalFractionRavuthL(2);
*wid = FinalFractionRavuthL(1);
}
Rectangle::Rectangle(Fraction& frac, Fraction& frac1)
: len(new Fraction()), wid(new Fraction())
{
// ....
}
由于实际上不需要指向Fraction
的指针,因此可以通过使用自动存储持续时间声明成员变量来避免使用new
进行分配。这将自动初始化和销毁对象,而无需调用new
和delete
class Rectangle
{
public:
// ....
private:
Fraction len;
Fraction wid;
};
Rectangle::Rectangle()
{
len = FinalFractionRavuthL(2);
wid = FinalFractionRavuthL(1);
}
Rectangle::Rectangle(Fraction& frac, Fraction& frac1)
{
// ....
}
答案 1 :(得分:0)
由于你没有提到具体的错误是什么,人们只能猜测......但是,因为你的class Box ....
没有包含两个引用的构造函数的声明(即使你似乎有提供了一个在框外的定义),试图调用new Box(x, y)
将失败,因为它无法找到正确的构造函数来调用。您应该在带有参数的Box
构造函数的定义上遇到错误,因为它们未在class Box
正文中声明。还有很多其他问题,但这些问题与您标记的行有特别相关。