#include <iostream.h>
#include <list>
#include "person.h"

  
class Team {

 public:
  class Player:public Person {
  private:
    int number;
    int points;

  public:
    int Number() { return number; }
    int Points() { return points; }
    friend istream& operator>>(istream&, Player&);
    friend ostream& operator<<(ostream&, const Player&);
  };
  
  typedef list<Player*> PlayerCont;
  typedef PlayerCont::iterator PlayerItor;
  typedef PlayerCont::const_iterator PlayerCItor;

 private:
  PlayerCont roster;
  char name[20];

 public:
  PlayerCont Roster() { return roster; }
  char* Name() { return name; }

  friend istream& operator>>(istream&, Team&);
  friend ostream& operator<<(ostream&, Team&);

};

istream& operator >> (istream& i, Team::Player& p)
{
  i >> (Person&) p;  // cast 

  if (i) {
    cout << "Enter player number: ";
    i >> p.number;
  }

  return i; // most common mistake: forgetting to return the stream
}

ostream& operator << (ostream& o, const Team::Player& p)
{
  o << (Person&) p;
  o << "Player Number: " << p.number << endl;

  return o;  // most common mistake: forgetting to return the stream
}

istream& operator >> (istream& i, Team& t)
{
  Team::Player* p;

  cout << "Team name: ";
  i >> t.name;
  
  cout << "Enter players.  ^D when finished." << endl << endl;

  while (i) {

    p = new Team::Player;
    i >> *p;

    if (i)
     t.roster.push_back(p);
  }

  delete p;  // always delete the last one.

  return i; // most common mistake: forgetting to return the stream
}

ostream& operator << (ostream& o, Team& t)
{
  Team::PlayerCItor i;

  o << t.name << endl;

  for(i=t.roster.begin(); i != t.roster.end(); i++)
    o << **i << endl;

  return o;  // most common mistake: forgetting to return the stream
}



