Help with Excercise

My excercise is:
Improve the Lobby class from the Game Lobby program by writing a
friend function of the Player class that allows a Player object to be sent
to cout. Next, update the function that allows a Lobby object to be sent
to cout so that it uses your new function for sending a Player object to
cout.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
//Game Lobby
//Simulates a game lobby where players wait

#include <iostream>
#include <string>
using namespace std;


class Player
{

public:
	Player(const string& name = "");
	string GetName() const;
	Player* GetNext() const;
	void SetNext(Player* next);

private:
	string m_Name;
	Player* m_pNext; // Pointer to next player in list
};


Player::Player(const string& name): // constructor
	m_Name(name), 
	m_pNext(0)
{}
string Player::GetName() const
{
	return m_Name;
}

Player* Player::GetNext() const
{
	return m_pNext;
}

void Player::SetNext(Player * next)
{
	m_pNext = next;
}

class Lobby
{
	friend ostream& operator<<(ostream& os, const Lobby& aLobby); // remember ostream& os then a comma!
public:
	Lobby();
	~Lobby();
	void AddPlayer();
	void RemovePlayer();
	void Clear();
private:
	Player* m_pHead;
};

Lobby::Lobby():
m_pHead(0)
{}

Lobby::~Lobby()
{
	Clear();
}



void Lobby::AddPlayer()
{
	// creates a new player node
	cout << "Please enter the name of your player: ";
	string name;
	cin >> name;
	Player* pNewPlayer = new Player(name);

	// if list is empty, make head of list this new player
	if(m_pHead == 0)
	{
		m_pHead = pNewPlayer;
	}
	// otherwise find the end of the list and add the player there
	else
	{
		Player* pIter = m_pHead;
		while(pIter->GetNext() != 0)
		{
			pIter = pIter->GetNext();
		}
		pIter->SetNext(pNewPlayer);
	}

}

	void Lobby::RemovePlayer()
	{
		if(m_pHead == 0)
		{
			cout << "The game lobby is empty, No one to remove!\n";
		}

		else
		{
			Player* pTemp = m_pHead;
			m_pHead = m_pHead->GetNext();
			delete pTemp;
		}
	}

	void Lobby::Clear()
	{
		while(m_pHead != 0)
		{
			RemovePlayer();
		}
	}

	ostream& operator<<(ostream& os, const Lobby& aLobby) // remember ostream& os then a comma!
	{
		Player* pIter = aLobby.m_pHead;
		os << "\nHere's whos in the game lobby:\n";
			if (pIter == 0)
			{
				os << "The game lobby is empty.\n";
			}

			else
			{
				while(pIter != 0)
				{
					os <<pIter->GetName() << endl;
					pIter = pIter->GetNext();
				}
			}

			return os;
	}

	int main()
	{
	Lobby myLobby;
	int choice;

	do 
	{
		cout << myLobby;
		cout << "\nGAME LOBBY\n";
		cout << "0 - Exit the program.\n";
		cout << "1 - Add a player to the lobby.\n";
		cout << "2 - Remove a player from the lobby.\n";
		cout << "3 - Clear the lobby.\n";
		cout << endl << "Enter choice: ";
		cin >> choice;

		switch (choice)
		{
		case 0: cout << "Good-bye.\n"; break;
		case 1: myLobby.AddPlayer(); break;
		case 2: myLobby.RemovePlayer(); break;
		case 3: myLobby.Clear(); break;
		default: cout << "That was not a valid choice.\n";
		}
	}
	
	while (choice != 0);

	return 0;
}


So far I've gotten to:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Player
{
	friend ostream& operator<<(ostream& os, const Player& aPlayer);
public:
	Player(const string& name = "");
	string GetName() const;
	Player* GetNext() const;
	void SetNext(Player* next);

private:
	string m_Name;
	Player* m_pNext; // Pointer to next player in list
};


But have no idea how to update it to allow a lobby object to be sent to cout maybe ostream but that's as far as I get.
Last edited on
Anyone??? The removeplayer function also just loops even if I copy it from the original book. Please can someone help me out?
Last edited on
Don't misunderstand the problem.

You already have a function that allows you to send a Lobby object to cout (line 116-135)

You need to create a similar function for Player objects. You've written the prototype in line 3 of the last block.

What you need to do now is
1. Provide an implementation of friend ostream& operator<<(ostream& os, const Player& aPlayer);
2. change the Lobby function ostream& operator<<(ostream& os, const Lobby& aLobby) so it uses your new output function (in line 129)

For example, and only for example:
1
2
3
4
5
6
7
8
ostream& operator<<(ostream& os, const Player& aPlayer) 
{
	{
		os << aPlayer.m_Name;
	}

	return os;
}


And then the Lobby function would change to
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
	ostream& operator<<(ostream& os, const Lobby& aLobby)
	{
		Player* pIter = aLobby.m_pHead;
		os << "\nHere's whos in the game lobby:\n";
			if (pIter == 0)
			{
				os << "The game lobby is empty.\n";
			}

			else
			{
				while(pIter != 0)
				{
					os << (*pIter) << endl;
					pIter = pIter->GetNext();
				}
			}

			return os;
	}

Topic archived. No new replies allowed.