C++ Operator Overload templates for overloaded comparison operators

Description

C++ Operator Overload templates for overloaded comparison operators

#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <iostream>

class  Pool/*from  w w w  .j av  a  2s.co m*/
{
private:
  double length {1.0};
  double width {1.0};
  double height {1.0};

public:
  // Constructors
  Pool(double lv, double wv, double hv) : length {lv}, width {wv}, height {hv} {}

  Pool() {}                                                             // No-arg constructor

  Pool(const Pool& pool)                                                  // Copy constructor
    : length {pool.length}, width {pool.width}, height {pool.height} {}

  double volume() const                                                // Function to calculate the volume
  {
    return length*width*height;
  }

  // Accessors
  double getLength() const { return length; }
  double getWidth() const { return width; }
  double getHeight() const { return height; }

  bool operator<(const Pool& aPool) const;                               // Less-than operator
  bool operator<(double aValue) const;                                 // Compare Pool volume < double value

  // Equality operator
  bool operator==(const Pool& aPool) const
  {
    return volume() == aPool.volume();
  }

};

// Less-than comparison for Pool objects
inline bool Pool::operator<(const Pool& aPool) const
{
  return volume() < aPool.volume();
}

// Compare the volume of a Pool object with a constant
inline bool Pool::operator<(double aValue) const
{
  return volume() < aValue;
}

// Function comparing a constant with volume of a Pool object
inline bool operator<(double aValue, const Pool& aPool)
{
  return aValue < aPool.volume();
}

using namespace std::rel_ops;

void show(const Pool& pool1, const std::string relationship, const Pool& pool2)
{
  std::cout << "Pool " << pool1.getLength() << "x" << pool1.getWidth() << "x" << pool1.getHeight()
    << relationship
    << "Pool " << pool2.getLength() << "x" << pool2.getWidth() << "x" << pool2.getHeight()
    << std::endl;
}

int main()
{
  std::vector<Pool> pools {Pool {2.0, 2.0, 3.0}, Pool {1.0, 3.0, 2.0},
    Pool {1.0, 2.0, 1.0}, Pool {2.0, 3.0, 3.0}};

  Pool thePool {3.0, 1.0, 3.0};

  for (auto& pool : pools)
    if (thePool > pool) show(thePool, " is greater than ", pool);

  std::cout << std::endl;
  for (auto& pool : pools)
    if (thePool != pool) show(thePool, " is not equal to ", pool);

  std::cout << std::endl;
  for (int i {}; i < pools.size() - 1; ++i)
    for (int j {i + 1}; j < pools.size(); ++j)
    {
      if (pools[i] <= pools[j])
        show(pools[i], " less than or equal to ", pools[j]);
    }
}



PreviousNext

Related