用于极坐标到矩形转换的坐标类的友元函数

Posted

技术标签:

【中文标题】用于极坐标到矩形转换的坐标类的友元函数【英文标题】:Friend function of Coordinate class for polar-to-rectangular conversion 【发布时间】:2015-02-07 02:46:59 【问题描述】:

我不知道如何做到这一点,我已经研究了几个小时。我的课本里只有一个朋友班的例子。

这就是问题“构造一个名为 Coord 的类,其中包含两个双精度变量 命名为 xval 和 yval,用于存储直角坐标中一个点的 x 和 y 值。 类方法应包括构造函数和显示方法以及友元函数 命名为 convPol()。 convPol() 函数应该接受两个双精度数,r 和 theta,表示极坐标中的一个点,并将它们转换为直角坐标。 对于从极坐标到直角坐标的转换,请使用以下公式: x = r cos(θ) y = r sin(theta)"

这是我想出的,但我知道我做错了我只是没有一个好的参考点,因为整本教科书中只有一个糟糕的例子,而且几乎完全不同。更具体地说,我不知道在哪里使用 coord&(如何引用数字)而且我知道我不应该使用指针。有人可以指出我正确的方向吗?

这是我的代码:

#include <iostream>
#include <cmath>
using namespace std;
//ƒclassƒdeclarationƒsection
void ConvPol(double r,double theta, double& xval, double& yval)
 
double x,y;
 xval=r*cos(theta);
 yval=r*sin(theta);
 return;


class Coord

  //ƒfriendsƒlist
  friend double ConvPol(Coord&);
  private:
  double xval;
  double yval;
  public:

    Coord (double = 0, double = 0);  //ƒconstructor
    void display();
;
//ƒclassƒimplementationƒsection
Coord::Coord(double x, double y)

  xval = x;
  yval = y;


void Coord::display()

cout <<xval<<","<<yval;
  return;

//ƒfriendƒimplementations
void time(double, double, double&, double&);

int main()
 double xval,yval;
  ConvPol(1,5,xval,yval);
  Coord a(xval,yval); 
  a.display();
  return 0;

【问题讨论】:

除非你有一个特定的问题/问题/错误,这是题外话,应该移到codereview.stackexchange.com 另外,r 标签用于 R 编程语言。不是当你有一个名为 R 的变量时;-) ConvPol作为班级Coord的朋友的声明不符合要求。试试friend void ConvPol(Coord&amp; point, double rho, double theta); 对于像convPol 这样的函数,您不需要friend 机制; convPol 这个名字不是自我描述的,并且患有不必要的任意缩短病;坐标类不应该有任何“显示方法”(你如何决定用户界面 API?)。简而言之,这是一项低质量的作业,教的是不好的东西。哪里来的? 我只是对使用好友列表感到困惑。我还在做这个计划。我已经让它做它应该做的事情,但我使用的是指针。 @Cheers 这个问题来自我的大学使用的教科书“A first book of c++ by Gary Bronson”。 【参考方案1】:

看起来你很困惑。这是我的理解:

class Coord

  friend void ConvPol(Coord& point,
                      double rho, // length
                      double angle);
;

void ConvPol(Coord& point, double rho, double angle)

  point.x = rho * cos(angle);  // Assign to the point member x
  point.y = rho * sin(angle);  // Assign to the point member y.
  

ConvPol函数根据需求,将极坐标(rho, angle)转换为笛卡尔坐标(x,y)。所以,函数需要rhoangle

由于函数是独立的(不在方法中),它需要一个Coord 实例来接收转换后的值。它是通过引用传递的,因为参数将被修改(根据函数的内容)。

该函数不返回任何内容,因此它的返回类型为void

由于该函数是Coordfriend,因此该函数可以直接访问数据成员,就好像没有任何访问权限一样(如struct)。

【讨论】:

谢谢托马斯,这很有帮助。我会解决这个问题,稍后再发回。这部分在我的书中大约有 2 页,只有一个奇怪的例子,再次感谢它。 根据你的解释,这个问题其实并不难。谢谢托马斯,你真的把事情弄清楚了! 如果这个答案有帮助,请点击复选标记。

以上是关于用于极坐标到矩形转换的坐标类的友元函数的主要内容,如果未能解决你的问题,请参考以下文章

类与类之间的友元关系可以继承吗? 友元函数是类的成员函数吗?

友元的友元类

什么是友元?

为啥 PRIVATE 成员函数不能成为另一个类的友元函数?

基类和派生类的友元函数

聊聊C# CLR中那些大量的友元函数,友元类的底层玩法