友元函数不会从类中获取私有变量

Friend function won't get private variables from class

本文关键字:获取 变量 函数 友元      更新时间:2023-10-16

我有一个家庭作业,要求我创建一个名为Coord的类,该类包含两个名为xval和yval的双变量。在类中,应该有constructor和display方法以及一个名为conPol()的友元函数。convPol()应该接受两个二重,r和theta,以将极坐标转换为极坐标。我把所有的东西都编码好了,只是现在我遇到了一些错误。这是我迄今为止拥有的

#include <iostream>
#include <cmath>
using namespace std;
class Coord
{
    friend double covPol(Coord&, Coord&);
private:
    double xval, yval;
public:
     Coord(double, double);
    void  display();

};
Coord::Coord(double X, double Y)
 {
    xval = X;
    yval = Y;
}
void Coord::display()
{
    cout << "The x-cordinate is: " << endl;
    cout << "The y- coordinate is: " << endl;
}
double convPol(Coord &r, Coord &theta)
{
    xval = r* cos (theta);
    yval = r* sin (theta); 
}

int main()
{
    Coord One(2 , 4); 
    One.convPol(2,4);
    One.display(); 
    return 0; 
}

以下是错误:

Error   1   error C2065: 'xval' : undeclared identifier c:usersthomasdocumentsvisual studio 2013projectsconpol().cppconpol().cppsource.cpp  36  1   conPol().cpp
Error   2   error C2665: 'cos' : none of the 3 overloads could convert all the argument types   c:usersthomasdocumentsvisual studio 2013projectsconpol().cppconpol().cppsource.cpp  36  1   conPol().cpp
Error   3   error C2065: 'yval' : undeclared identifier c:usersthomasdocumentsvisual studio 2013projectsconpol().cppconpol().cppsource.cpp  37  1   conPol().cpp
Error   4   error C2665: 'sin' : none of the 3 overloads could convert all the argument types   c:usersthomasdocumentsvisual studio 2013projectsconpol().cppconpol().cppsource.cpp  37  1   conPol().cpp
Error   5   error C2039: 'convPol' : is not a member of 'Coord' c:usersthomasdocumentsvisual studio 2013projectsconpol().cppconpol().cppsource.cpp  45  1   conPol().cpp
6   IntelliSense: identifier "xval" is undefined    c:UsersThomasDocumentsVisual Studio 2013ProjectsconPol().cppconPol().cppSource.cpp  36  2   conPol().cpp
7   IntelliSense: no instance of overloaded function "cos" matches the argument list
        argument types are: (Coord) c:UsersThomasDocumentsVisual Studio 2013ProjectsconPol().cppconPol().cppSource.cpp  36  12  conPol().cpp
8   IntelliSense: identifier "yval" is undefined    c:UsersThomasDocumentsVisual Studio 2013ProjectsconPol().cppconPol().cppSource.cpp  37  2   conPol().cpp
9   IntelliSense: no instance of overloaded function "sin" matches the argument list
        argument types are: (Coord) c:UsersThomasDocumentsVisual Studio 2013ProjectsconPol().cppconPol().cppSource.cpp  37  12  conPol().cpp

根据我的理解,我的朋友函数无法从我的类中获得私有变量。此外,我的sin和cos函数不起作用。我已经包含了,所以我不确定为什么它不起作用。至于友元函数不能得到变量,我不知道。

在您的代码中,您正试图完成极坐标到矩形坐标的转换。

既然你已经有了一个构造函数,你甚至不需要一个友元函数。此外,参数的类型应该是float或double,而不是Coord。

因此,函数签名是:

Coord convPol(double r, double theta)
{
    double xval = r* cos (theta), 
           yval = r* sin (theta); 
    return Coord(xval, yval);
}

这个功能就足以达到你想要达到的目的。

friend唯一要做的就是放宽权限。

正如您所定义的,convPol是一个全局函数,而不是Coord的成员函数。因此,将其称为成员函数或将其实现为成员函数是没有意义的。但是,如果要操作Coord类型的任何实际对象,则可以在该函数中访问它们的xvalyval成员。

关于sincos不工作,错误消息告诉您原因:

no instance of overloaded function "cos" matches the argument list
    argument types are: (Coord)

这将提示您检查传入的变量的类型:例如,当您调用cos(theta)时,您可以看到theta的类型为Coord。那肯定不是你的意思!

您在文本中提到了几个友元函数:conPol()convPol(),然后在代码中提到了covPol(Coord&, Coord&)convPol(Coord &r, Coord &theta)。我首先要弄清楚你希望你的函数被调用什么。