c++重载<使用C++中的友元函数进行多个类?

我正在试验重载<运营商(我将稍后添加>)作为检查其中一条金鱼(请参见下面的代码)是否属于另一条金币(区域可以重叠)的方法。即时通过代码获得多个编译错误 - 主要是为了能够访问私有变量,即使我已经使重载的运算符成为两者的友元函数。 我的语法错了吗?

    /* fish program:
each fish will start out with a static size and a territory.
they may attack each other, in which case the outcomes with depend on 
1) their location (ie. if the attacking fish is on the territory of another goldfish
2) the relative size of the two fish
depending on the outcome of the attack - the fish may retreat or triumph.
triumph will increase its territory.
*/
#include <iostream>
using namespace std;
class point {
private:
  float x;
  float y;
public: 
  point(float x_in, float y_in) { //the 2 arg constructor 
    x = x_in;
    y = y_in;
  }
friend bool operator< ( const point &point_a, const territory &the_territory);
};
class territory {
private:
  point ne, sw;
public:
  territory(float x_ne, float y_ne, float x_sw, float y_sw) 
    : ne(x_ne, y_ne), sw(x_sw,y_sw) {
    cout << ne.x << " and " << ne.y <<endl; //debug
  }
friend bool operator< ( const point &point_a, const territory &the_territory) {
    if((point_a.x < the_territory.ne.x && point_a.x > the_territory.ne.x) && 
       (point_a.y < the_territory.ne.y && point_a.y > the_territory.ne.y))
      return true;
  }
};
class goldfish {
private:
  float size;
  point pos;
  territory terr;
public:
goldfish(float x, float y) : pos(x,y), terr(x-1,y-1,x+1,y+1)  { //constructor
       size = 2.3;
}
void retreat() { //what happens in the case of loss in attack
}
  void triumph() {
  }
void attack() {
}
};
int main() {
goldfish adam(1,1); // fish1
  goldfish eve(1.2,1.2); // fish2
}
已邀请:

raut

赞同来自:

我没有检查你的程序的逻辑,但有一些简单的说明。我评论了这些补充:

class territory; // declare the class used in operator<
class point {
private:
    float x;
    float y;
public: 
    point(float x_in, float y_in) {
        x = x_in;
        y = y_in;
    }
float getx() { return x;} // add public "getter" for x
    float gety() { return y;} // same for y
friend bool operator< ( const point &point_a, const territory &the_territory);
};
另外,不要忘记使用我们上面定义的getter:
territory(float x_ne, float y_ne, float x_sw, float y_sw) 
    : ne(x_ne, y_ne), sw(x_sw,y_sw) {
        // access x and y through getters
        cout << ne.getx() << " and " << ne.gety() <<endl;
}  

cut

赞同来自:

您无法访问territory构造函数中的私有成员(即使出于调试目的)。 此外,您可能需要在声明point类之前转发声明territory类。否则编译器可能会抱怨友元操作符声明,因为它使用territory作为参数类型。 UPD:跟随AraK的例子,我正在打字而没看到它

要回复问题请先登录注册