我有一个看起来像这样的课程:
class Player
{
friend bool operator>=(Player &pl1, Player &pl2)
{
return true;
};
private:
int nr, height, weight;
}
球员的数量,身高和体重。 现在我想知道Player1是否比Player2更大和/或更重。在此之后,我想将它打印出来:
Player A is 2 cm bigger (smaller) and 7 kg heavier (lighter) than Player B.
当我只能返回真或假时,如何管理它?当他变得更大更重或者更小或更轻时,我可以回归真实,但我应该如何管理更大/更轻?更小/更重的情况?
编辑:我必须与operator>=
一起做。这是我学校的考试,条件是这样做。这是文字:
输入后,将显示玩家。通过使用运算符重载> =将检查玩家是否更大 和/或比其他玩家重。将显示确定数据的结果,例如:玩家A比玩家B大2厘米(更小)和重7公斤(更轻)。
答案 0 :(得分:4)
如果您的课程不存在严格的排序,请不要定义排序操作员。
相反,您可以编写heightDifference
和weightDifference
等函数:
int heightDifference (const Player& a, const Player& b)
{
return a.height - b.height;
}
然后,您可以使用这些功能来计算出您需要的信息。
答案 1 :(得分:2)
您还可以尝试一种典型的优化问题方法。
当您有多个(冲突的)目标时,您可以尝试对其值进行标量聚合/投影。
即。你有两个不同的目标:最大化重量和高度(>=
可以解释为令人敬畏的运算符!):
double impressive(int height, int weight)
{
return height + ratio * weight; // some good ratio
// lexicographic ordering induced by very large/small values of ratio.
}
bool operator>=(Player &a, Player &b)
{
return impressive(a.height, a.weight) >= impressive(b.height, b.weight);
};
这一切都取决于运营商的语义。
答案 2 :(得分:1)
你可以制作一个比较函数,返回std::pair
,其中一个给你高度的差异,另一个给你不同的重量。
using namespace std;
pair<int,int> compare(Player &a, Player &b)
{
return make_pair(a.height-b.height, a.weight-b.weight);
}
最后,您只需将if-else
添加到您想要的任何内容即可比较结果。
答案 3 :(得分:1)
因此,如果您以不同方式组织课程,也许您可以执行以下操作:
class PlayerWeight {
private:
int weight;
public:
int getWeight() const {
return weight;
}
bool operator >=( const PlayerWeight &playerWeight ) {
return weight >= playerWeight.getWeight();
}
PlayerWeight( int weight ) : weight( weight ) {
}
};
class PlayerHeight {
private:
int height;
public:
int getHeight() const {
return height;
}
bool operator >=( const PlayerHeight &playerHeight ) {
return height >= playerHeight.getHeight();
}
PlayerHeight( int height ) : height( height ) {
}
};
class Player : public PlayerHeight, public PlayerWeight {
public:
PlayerHeight& height() {
return *this;
}
PlayerWeight& weight() {
return *this;
}
Player( int height, int weight ) : PlayerHeight( height ), PlayerWeight( weight ) {
}
};
int main( int argc, char**argv ) {
Player playerA( 72, 180 ), playerB( 74, 160 );
// comparison
std::cout << "Player A is " << ( (PlayerHeight)playerA >= playerB ? "bigger" : "smaller" ) << " and " << ( (PlayerWeight)playerA >= playerB ? "heavier" : "lighter" ) << std::endl;
// or...
std::cout << "Player A is " << ( playerA.height() >= playerB ? "bigger" : "smaller" ) << " and " << ( playerA.weight() >= playerB ? "heavier" : "lighter" ) << std::endl;
return 0;
}
答案 4 :(得分:0)
订单运算符(<=
)的问题在于普通凡人将它们用作完整的顺序关系:反对,反身和传递,并为每对夫妻定义。如果这4条规则中的任何一条不成立请勿使用 <=
。
如果您需要与您的要求相符的总订单(或至少不违反要求),我的建议是:
这意味着您将两个订单关系与一个优先级相结合。