简体   繁体   中英

c++ overload < using a friend function in C++ for multiple classes?

i am experimenting with overloading the < operator (i'll add the > later) as a means for checking if one of the goldfish (please see code below) is within the territory of another (the territories can overlap). im getting multiple compile errors with teh code - primarily to do with being able to access the private variables, even though i've made the overloaded operator a friend function for both of them.

am i doing the syntax wrong perhaps?

    /* 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




}

I haven't checked the logic of your program, but there are some simple notes. I commented the additions:

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);
};

Also, don't forget to use the getters we defined above:

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;
}  

You can no access private members of point in territory constructor (even for debug purposes). Also you may need to forward declare territory class before you declare point class. Otherwise compiler may complain about friend operator declaration as it uses territory as argument type. UPD: Just follow AraK example, I was typing and did not see it

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM