C ++运算符重载> =有2个不同的返回值

时间:2015-06-16 13:13:11

标签: c++ return operator-overloading

我有一个看起来像这样的课程:

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公斤(更轻)。

5 个答案:

答案 0 :(得分:4)

如果您的课程不存在严格的排序,请不要定义排序操作​​员。

相反,您可以编写heightDifferenceweightDifference等函数:

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条规则中的任何一条不成立请勿使用 <=

如果您需要与您的要求相符的总订单(或至少不违反要求),我的建议是:

  • 如果A if(严格地)大于B则B <= A(实际上B
  • 如果A与B的尺寸相同,并且A比B重(或相同的重量)则B <= A
  • 否则A&lt; = B(事实上A&lt; B)

这意味着您将两个订单关系与一个优先级相结合。