朋友功能不会从课堂上获取私有变量

时间:2015-03-23 20:34:43

标签: c++ friend

我有一个家庭作业,要求我创建一个名为Coord的类,其中包含两个名为xval和yval的双变量。在课堂上,应该有construtor和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:\users\thomas\documents\visual studio 2013\projects\conpol().cpp\conpol().cpp\source.cpp  36  1   conPol().cpp

Error   2   error C2665: 'cos' : none of the 3 overloads could convert all the argument types   c:\users\thomas\documents\visual studio 2013\projects\conpol().cpp\conpol().cpp\source.cpp  36  1   conPol().cpp

Error   3   error C2065: 'yval' : undeclared identifier c:\users\thomas\documents\visual studio 2013\projects\conpol().cpp\conpol().cpp\source.cpp  37  1   conPol().cpp

Error   4   error C2665: 'sin' : none of the 3 overloads could convert all the argument types   c:\users\thomas\documents\visual studio 2013\projects\conpol().cpp\conpol().cpp\source.cpp  37  1   conPol().cpp

Error   5   error C2039: 'convPol' : is not a member of 'Coord' c:\users\thomas\documents\visual studio 2013\projects\conpol().cpp\conpol().cpp\source.cpp  45  1   conPol().cpp

6   IntelliSense: identifier "xval" is undefined    c:\Users\Thomas\Documents\Visual Studio 2013\Projects\conPol().cpp\conPol().cpp\Source.cpp  36  2   conPol().cpp

7   IntelliSense: no instance of overloaded function "cos" matches the argument list
        argument types are: (Coord) c:\Users\Thomas\Documents\Visual Studio 2013\Projects\conPol().cpp\conPol().cpp\Source.cpp  36  12  conPol().cpp

8   IntelliSense: identifier "yval" is undefined    c:\Users\Thomas\Documents\Visual Studio 2013\Projects\conPol().cpp\conPol().cpp\Source.cpp  37  2   conPol().cpp

9   IntelliSense: no instance of overloaded function "sin" matches the argument list

        argument types are: (Coord) c:\Users\Thomas\Documents\Visual Studio 2013\Projects\conPol().cpp\conPol().cpp\Source.cpp  37  12  conPol().cpp

据我所知,我朋友的功能是不能从我的班级获取私有变量。此外,我的罪和cos功能不起作用。我已经加入了,所以我不确定为什么它不起作用。至于朋友功能无法获取变量,我不知道。

3 个答案:

答案 0 :(得分:0)

从您的代码中,您正在尝试完成极坐标转换为矩形转换。

既然你已经掌握了构造函数,你甚至不需要友元函数。参数也应该是float或double类型而不是Coord。

因此功能签名是:

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

此功能足以达到您想要达到的目的。

答案 1 :(得分:0)

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

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

关于sincos无效,错误消息会告诉您原因:

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

这会提示您检查传入的变量的类型:例如当您致电cos(theta)时,您会发现theta的类型为Coord。那肯定不是你的意思!

答案 2 :(得分:0)

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