/*************************************************/
// R. A. Hillyard
// inventory03.cpp
// November 2001
//
//class with constructors and friend function
/*************************************************/

#include <iostream>
#include <iomanip>

using namespace std;

class Inventory
  {
  public:
    //friend functions hasMost 
    friend Inventory hasMost(Inventory p1, Inventory p2, Inventory p3);

    //member function hasMost
    Inventory hasMost(Inventory p1, Inventory p2);
    //constructors
    Inventory();
    Inventory (int num);
    Inventory (int num, int stock, double price);
    void input();
    void output();
    int getPartNum();
    int getInStock();
    double getCost();

  private:
    int partNum;
    int inStock;
    double cost;
  };
/****************************************************************/
Inventory hasMost(Inventory p1, Inventory p2, Inventory p3)
  {
  if(p1.inStock > p2.inStock && p1.inStock > p3.inStock)
    {  return p1;  }
  if(p2.inStock > p1.inStock && p2.inStock > p3.inStock)
    {  return p2;  }
  return p3;
  }

/****************************************************************/
Inventory Inventory::hasMost(Inventory p1, Inventory p2)
  {
  if(p1.inStock > p2.inStock && p1.inStock > inStock)
    {  return p1;  }
  if(p2.inStock > p1.inStock && p2.inStock > inStock)
    {  return p2;  }
  return *this;   //return the calling object
  }
/****************************************************************/
Inventory::Inventory()
  {
  cout << "In default Constructor\n";
  partNum = -1;
  inStock = 0;
  cost = 0.0;
  }
/****************************************************************/
Inventory::Inventory (int num)
  {
  cout << "In 1 arg Constructor\n";
  partNum = num;
  inStock = 0;
  cost = 0.0;
  }
/****************************************************************/
Inventory::Inventory (int num, int stock, double price)
  {
  cout << "In 3 arg Constructor\n";
  partNum = num;
  inStock = stock;
  cost = price;
  }
/****************************************************************/
void Inventory::input()
  {
  cout << "\nenter part number, number in stock, and the cost:\n>";
  cin >> partNum >> inStock >> cost;
  }
/****************************************************************/
void Inventory::output()
  {  cout << setw(6) << partNum << setw(6) << inStock << setw(8) << cost << endl;  }
/****************************************************************/
int Inventory::getPartNum()
  { return partNum; }
/****************************************************************/
int Inventory::getInStock()
  { return inStock; }
/****************************************************************/
double Inventory::getCost()
  { return cost; }
/****************************************************************/
int main()
  {
  Inventory part1(1234, 542, 12.99);
  Inventory part2(2345, 234, 77.69);
  Inventory part3(8765, 87, 1352.63);
  Inventory part4;
  cout << "*** Inventory Database ***\n";
  part1.output();
  part2.output();
  part3.output();

  //call friend function
  part4 = hasMost(part1, part2, part3);
  cout << "The part with the most stock is: ";
  part4.output();

  //call default constructor to reset part4
  part4 = Inventory();
  cout << "Part after being reset is: ";
  part4.output();

  //call member function
  part4 = part3.hasMost(part1, part2);
  cout << "\nThe part with the most stock is: ";
  part4.output();
  }
/**********************Program Output***************************
In 3 arg Constructor
In 3 arg Constructor
In 3 arg Constructor
In default Constructor
*** Inventory Database ***
  1234   542   12.99
  2345   234   77.69
  8765    87 1352.63
The part with the most stock is:   1234   542   12.99
In default Constructor
Part after being reset is:     -1     0       0
The part with the most stock is:   1234   542   12.99
/****************************************************************/