所以我对C ++编码很新,在我目前的编程课程中,我们正在学习运算符重载和友元函数。我们被告知要创建一个具有不同类型的构造函数和重载运算符的类Money。当我们没有指向私有成员变量的指针时,程序会容易得多,但现在它有点过头了。
在继续定义其余的重载操作符函数之前,我想得到一些帮助。基本上我要做的是将Money类的两个对象一起添加,但是当我运行程序时,我继续遇到分段错误。我知道这与指针和访问无法访问的内存有关,但我不确定我哪里出错了。
到目前为止这是一个简短的程序,所以代码应该易于阅读。任何帮助将不胜感激!
class Money
{
public:
Money(int d=0, int c=0);
Money(const Money&);
// ~Money();
Money& operator=(const Money&);
Money operator+(const Money&) const;
Money operator-(const Money&) const;
Money& operator*(double);
Money& operator/(double);
friend istream& operator>>(istream&, Money&);
friend ostream& operator<<(ostream&, const Money&);
private:
int* dollars;
int* cents;
};
int main()
{
Money m1(3, 43), m2(4, 64);
Money m3 = m1 + m2;
return 0;
}
Money::Money(int d, int c)
{
*dollars = d;
*cents = c;
}
Money Money::operator+(const Money& m1) const
{
Money result;
*result.dollars = *this->dollars + *m1.dollars;
*result.cents = *this->cents + *m1.cents;
return result;
}
答案 0 :(得分:2)
您尚未为dollars
和cents
分配内存。您应该在构造函数中执行此操作:
Money::Money(int d, int c)
{
dollars = new int;
cents = new int;
*dollars = d;
*cents = c;
}
不要忘记在析构函数中释放内存:
Money::~Money() {
delete dollars;
delete cents;
}
否则,您只是声明有两个指向int
s(dollars
和cents
)的指针,但您实际上并未确定它们指向内存中的有效位置;他们没有初始化。
提示:在实现复制构造函数(Money(const Money&)
)和运算符时,请尽量记住此资源管理(感谢@LokiAstari彻底)。