我正在试验重载<运营商(我将添加>稍后)作为检查其中一条金鱼(请参见下面的代码)是否在另一条金币(区域可以重叠)范围内的手段。即时通过代码获得多个编译错误 - 主要是为了能够访问私有变量,即使我已经使重载运算符成为两者的友元函数。
我的语法错了吗?
/* 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
}
答案 0 :(得分:1)
我没有检查过程序的逻辑,但有一些简单的注释。我评论了补充说明:
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;
}
答案 1 :(得分:0)
您无法访问territory
构造函数中的私有成员(即使是出于调试目的)。
此外,您可能需要在声明territory
类之前转发声明point
类。否则编译器可能会抱怨友元操作符声明,因为它使用territory
作为参数类型。
UPD:按照AraK的例子,我正在打字而没看到它