为了演示我的问题,让我们看一下以下示例:
IV
有一个类#include "stdafx.h"
#include <iostream>
using namespace std;
class MyClass {
public:
long double x, y;
MyClass(const long double &xx = 0, const long double &yy = 0);
long double distance(const MyClass &b) {
return sqrt((x - b.x)*(x - b.x) + (y - b.y)*(y - b.y));
}
};
MyClass::MyClass(const long double &xx, const long double &yy) {
x = xx; y = yy;
}
void WriteDistance(const MyClass &a, const MyClass &b) {
cout << a.distance(b) << endl;
}
int main()
{
MyClass a = MyClass(2., 3.);
MyClass b = MyClass(3., 4.);
cout << a.distance(b) << endl;
return 0;
}
,并且有一个类函数距离,它接受一个MyClass
变量并返回现有点和参数点之间的距离。
问题是:在main()中,函数工作(没有错误)。但是,WriteDistance()函数中存在错误,内容为:MyClass
和the object has type qualifiers that are not compatible with the member function "MyClass::distance"
。
如果我重载距离函数(不仅要使用一个MyClass对象,而且可能还有两个长双精度,只是为了获得可用性),错误显示为:'long double MyClass::distance(const MyClass &)': cannot convert 'this' pointer from 'const MyClass' to 'MyClass &'
和no instance of overloaded function "MyClass::distance" matches the argument list and object (the object has type qualifiers that prevent a match)
。< / p>
问题是:为什么会出现这种错误以及如何预防?我发现没有使'MyClass::distance': 2 overloads have no legal conversion for 'this' pointer
MyClass &a
(因此删除&#34; const
&#34;)摆脱了错误。但为什么?这个网站的成员告诉我无数次总是通过const
引用来防止复制对象。如果我无法通过const
引用,这是否意味着我的函数const
在此过程中以某种方式更改了对象?是否有一些解决方法能够真正拥有它WriteDistance
?
答案 0 :(得分:4)
您的distance
函数声称要修改调用它的对象,这就是为什么您不能在const MyClass
类型的值上使用它。
您应该将其声明为
long double distance(const MyClass &b) const {
// ^^^^^
第二个const
表示它不会修改类成员(即*this
在函数中是const
。
答案 1 :(得分:3)
使用限定符const
声明成员函数long double distance(const MyClass &b) const {
//...
如果要使用两个参数声明函数,请将其设置为静态。例如
static long double distance(const MyClass &a, const MyClass &b) {
//...
答案 2 :(得分:-1)
您需要为 const 对象添加 const 限定版本功能&#39;用法。我们通常提供两个版本的函数声明,const和非const。 const版本用于const Class对象,如 const MyClass&amp; b
void WriteDistance(const MyClass &a, const MyClass &b) const {
cout << a.distance(b) << endl;
}