c ++类函数在另一个函数中不能按预期工作

时间:2017-11-02 10:33:37

标签: c++ function class

为了演示我的问题,让我们看一下以下示例:

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()函数中存在错误,内容为:MyClassthe 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

3 个答案:

答案 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;
}