我正在编写一个介绍c ++课程的程序,并且我收到了一条我不理解的错误消息。我有一个名为fraction的类,有一个名为DividedBy的成员函数。 DividedBy被初始化并定义如下:
fraction fraction::DividedBy(fraction operand)
fraction fraction::DividedBy(fraction operand){
int quotNum = num * operand.num;
int quotDenom = denom * operand.denom;
simplify(quotNum, quotDenom);
fraction quot = fraction(quotNum, quotDenom);
return quot;}
我正在调用DividedBy这个函数:
result = f3.DividedBy(f4);
结果,f3和f4都是分数对象。我收到此错误消息:
传递' const fraction'作为'这个' '分数分数的参数:: DividedBy(分数)'抛弃限定符[-fpermissive]
这是什么意思?我已经查到了这条消息,似乎总是让某人试图传递一个不断的争论,我很确定我不会在这里做。我以某种方式丢弃了什么限定符?
答案 0 :(得分:2)
这意味着您已将f3声明为const fraction
类型,这意味着您无法更改它。即使方法DividedBy
没有改变它,也不能保证它,所以编译器假设方法可以以某种方式改变它。
这里的解决方案要么不使f3保持不变,要么通过将声明和定义更改为
来使方法DividedBy
保持不变
fraction fraction::DividedBy(fraction operand) const
fraction fraction::DividedBy(fraction operand) const {
...
}
根据经验,最好使任何可以保持不变的常数。例如,您可以创建类型const fraction &
的操作数,这样可以防止对类进行不必要的复制,同时在传递常量分数时仍然不会阻止代码编译。
最后一部分[-fpermissive]
只是编译器告诉你如何抑制这个警告并让它继续编译(你只需将这个标志传递给编译器)。很高兴知道有这个选项,但你永远不应该使用它,除非你真的确定你在做什么以及为什么它不能以正确的方式完成。
答案 1 :(得分:1)
f3是一个const引用,如果是这样,DevidedBy必须声明为const。