使用重载运算符和成员指针时出现分段错误 所以我在C++编程中是相当新的,在我现在的编程课程中,我们正在学习运算符重载和朋友函数。我们被告知要制作一个具有不同类型构造函数和重载运算符的类Money。当我们没有私有成员变量的指针时,这个程序就容易多了,但现在它有点超出我的理解范围

使用重载运算符和成员指针时出现分段错误 所以我在C++编程中是相当新的,在我现在的编程课程中,我们正在学习运算符重载和朋友函数。我们被告知要制作一个具有不同类型构造函数和重载运算符的类Money。当我们没有私有成员变量的指针时,这个程序就容易多了,但现在它有点超出我的理解范围,c++,pointers,segmentation-fault,C++,Pointers,Segmentation Fault,在继续定义其他重载运算符函数之前,我想在这方面得到一些帮助。基本上,我试图做的是将Money类的两个对象添加到一起,但在运行程序时,我不断遇到分段错误。我知道这与指针和访问无法访问的内存有关,但我不确定哪里出错了 到目前为止,这是一个简短的程序,因此代码应该很容易阅读。任何帮助都将不胜感激 class Money { public: Money(int d=0, int c=0); Money(const Money&); // ~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;
}
阶级金钱
{
公众:
货币(整数d=0,整数c=0);
货币(const Money&);
//~Money();
货币和运营商=(常量货币和);
货币操作员+(常量货币和)常量;
货币操作员-(const Money&)const;
货币和运营商*(双倍);
货币和运营商/(双倍);
朋友istream&operator>>(istream&金钱&);
friend ostream&OperatorContents+*m1.0美分;
返回结果;
}

您尚未为
美元和
美分分配内存。您应该在构造函数中执行此操作:

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的深入研究)时,请记住此资源管理。

为什么要将美元和美分定义为指向整数的指针?那是个坏主意。您尝试使用这些整数(取消指针限制)而不实际初始化它们。是否需要使用int*表示美元和美分?如果您的作业允许,请使用普通整数。我需要使用指向整数的指针表示美元和美分。我希望我能!仍在学习动态内存分配的细节。@DaneWind“我必须使用指向整数的指针来表示美元和美分”这完全是胡说八道,请告诉你的教授。@DaneWind请重新阅读你的问题这不是一个用于指针的好地方。非常感谢。我仍然在学习很多关于指针的知识,我想我完全跳过了这一点。@Danewin为什么你需要简单的
int
变量的指针?这个建议让问题变得更糟。@LokiAstari:直到OP确认他们实际上不需要
美元和
美分作为指针,这个答案应该可以。@frslm不同意。您的解决方案违反了三条规则,因此导致的问题比它解决的问题多得多。