发布网友 发布时间:2022-04-26 19:10
共1个回答
热心网友 时间:2022-05-01 23:36
你的问题关键出在const成员函数上。这个概念你或许不常见,我先给你说一下,之后给你解决办法。
---------------------const成员函数---------------------------
类的const成员函数的格式为:
返回类型 函数名() const
{
...
}
也就是在函数名后面加一个const。类的这种成员函数不允许改变类的成员数据值,也就是说在这种函数体内,不能有改变(或企图改变)类的成员数据的操作,否则会发生编译错误。
比如:
class A
{
public:
int a;
void f() const
{
a = 1;
}
};
这是错误的,因为f()中改变了成员数据a的值。
再如:
class A
{
public:
int a;
void set()
{
a = 1;
}
void f() const
{
set();
}
};
这也是错误的,因为set()函数会改变成员数据的值,在f()中不应调用它。
再如:
class A
{
public:
int a;
void set()
{
}
void f() const
{
set();
}
};
这仍然是错误的。虽然在set()中并有改变a的值,但由于set()函数不是const函数,编译器仍然“认为”它会改变a的值,所以在f()中也不能调用set()。只要一个函数不被const修饰,编译都认为它会改变成员数据的值!
不光const函数如此,被const修饰的对象的值也是不允许改变的。比如你程序中的参数const Cube& aBox。
---------------------你的问题---------------------------
下面我说一下你的程序。
在你的operator<函数中,其参数为const Cube& aBox,这个参数被const修饰,说明它的值不允许改变。而它的volumn()函数却没有const修饰,编译器会认为volumn()函数会改变aBox的成员数据值,所以编译通不过。
解决办法是:在你的volumn()函数后加上const就行了(类内定义和类外实现都要加const),如“double volume() const”。
另外,还有一个小错误:你的operator<函数的参数应是const Cube& aBox,而不是const Box& aBox。
累死了!看在我给你敲这么多字的份上,多给几分吧。祝你顺利!