我无法正常使用好友功能

时间:2018-01-20 10:59:16

标签: c++

我正在编写一个代码来声明一个类的成员函数作为朋友,但我收到错误。 代码是

#include<iostream>

class Vect;

class Coordinate {
    float x;
    float y;

public:
    Coordinate(float a,float b):x(a),y(b){}// constructor
    Coordinate():x(0),y(0){};//constructor
    display()
    {
        std::cout<<"\nx:"<<x<<" "<<"y:"<<y;
    }
    friend Vect::add(Coordinate B);
};

class Vect {
public:
    add(Coordinate A)
    {
        std::cout<<A.x;
    }
};

确切的错误是

  

无效使用不完整类型'类Vect'|和前瞻性声明   'class Vect'|

2 个答案:

答案 0 :(得分:2)

  class Y; //forward declaration of class Y
  class X
  {
  public:
        int getmark(Y);
  };

  class Y
  {
  int mark;
   public:
   Y() {}
   friend int X::getmark(Y);
   };

   int X::getmark(Y obj) {
   cin >> obj.mark;
  return obj.mark;
  }

int main()
{
  X a;
  Y b;
  a.getmark(b);
}

首先,当创建对象a(类X)时,为了将Y参数声明为X :: getmark(),必须使用类Y的前向声明。

创建对象b(类Y)不会成为问题,因为编译器知道存在类X(对于友元函数)。

然后,只需通过对象a。

调用函数getmark()

注意:必须在声明类Y之后声明函数getmark(),否则编译器会将类Y视为不完整类型。

答案 1 :(得分:1)

你可以用这个:

class Vect;
class Coordinate
{
 public:
  Coordinate(float a = 0f, float b = 0f) :x(a), y(b) {}// constructor
  float x;
  float y;
void display()
{
    std::cout << "\nx:" << x << " " << "y:" << y;
}
  friend int add(Coordinate B);
};
class Vect
{
  friend int add(Coordinate B);
public:

};

int add(Coordinate B)
{
   std::cout << B.x << std::endl;
   return B.x;
}