使用重载操作符和成员指针时的分段错误

问题描述:

所以我对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; 
} 
+1

为什么要将美元和美分定义为整数的指针?这是一个坏主意。你尝试使用这些整数(derefence指针),而不实际初始化它们。 – NineBerry

+1

您是否需要使用int *作为美元和美分?如果您的任务允许,请使用plain int。 – Darryl

+1

我需要用美元和美分的int指针。我希望我能!还在学习动态内存分配的来龙去脉。 –

你还没有为dollarscents分配的内存。你应该这样做在你的构造:

Money::Money(int d, int c) 
{ 
    dollars = new int; 
    cents = new int; 

    *dollars = d; 
    *cents = c; 
} 

而且不要忘记释放在析构函数的内存:

Money::~Money() { 
    delete dollars; 
    delete cents; 
} 

否则,你只是宣称你有两个指针int S( dollarscents),但实际上并未确保它们指向内存中的有效点;他们未初始化。

提示:在实现复制构造函数(Money(const Money&))和运算符(感谢@LokiAstari进行彻底检查)时,请牢记这一资源管理。

+1

非常感谢。我仍然在学习很多关于指针的知识,我想我完全忽略了这一点。 –

+1

@DaneWind为什么你需要所有简单的'int'变量的指针? – user0042

+1

这个建议会让问题变得更糟。 –