Something completely different: vector
You have seen it, and you may want to use it, so here is a complete short description of the "vector" datatype.
What is vector? vector is the answer to all the problems with arrays.
It is in the header <vector>
In the namespace std
To declare a vector, use the typename vector, and then the contained datatype in pointy brackets <>. Example:
vector<int> bla; // as opposed to int bla[]; vector<Location *> loc; vector<string> names; vector<boolean> isItTrue; vector<vector<int>> twoDVector;
To add elements to a vector, use its method push_back. push_back takes exactly one argument, which must be of the same type the vector enumerates. Examples:
bla.push_back(1); loc.push_back(new Location(1,2)); names.push_back("Test"); isItTrue.push_back(true); twoDVector.push_back(bla); // Probably. Need to test this!
Another important function is "size". Size takes no parameters and returns the number of elements. Example:
vector<int> x; x.push_back(23); x.push_back(42); cout << x.size() << endl; // prints 2
To access elements you can use the [] operator just like with arrays. Just like arrays the first element is at index 0 and the last element is at .size() - 1. Do not access elements out of range! Example:
cout << x[0] << endl; // prints 23 cout << x[1] << endl; // prints 42
You may also write to elements, but only to existing ones!
x[1] = 7; // valid x[2] = 123; // Will crash. Use .push_back to add elements!
vector has many more fun features. Read C++ in a Nutshell, pg. 722 - 726 if you are interested.
More complete example: The Coin Toss Game again.
// Coin.h #ifndef COIN_H_ #define COIN_H_ #include <iostream> enum Side { HEADS, TAILS }; std::ostream& operator<< ( std::ostream &o, Side s); #endif /*COIN_H_*/
// ComputerPlayer.h #ifndef COMPUTERPLAYER_H_ #define COMPUTERPLAYER_H_ #include "Player.h" class ComputerPlayer : public Player { private: Side bet; public: virtual void makeBet(); virtual Side getBet() { return bet; } ComputerPlayer(std::string name); }; #endif /*COMPUTERPLAYER_H_*/
// HumanPlayer.h #ifndef HUMANPLAYER_H_ #define HUMANPLAYER_H_ #include "Player.h" class HumanPlayer : public Player { private: Side bet; public: HumanPlayer(); HumanPlayer(std::string name); virtual void makeBet(); virtual Side getBet() { return bet; } }; #endif /*HUMANPLAYER_H_*/
// Player.h #ifndef PLAYER_H_ #define PLAYER_H_ #include "Coin.h" #include <string> class Player { protected: std::string name; Player() {} public: Player(std::string name) { this->name = name; } virtual ~Player() {} virtual void makeBet()=0; virtual Side getBet()=0; std::string getName() { return name; } }; #endif /*PLAYER_H_*/
// TossGame.h #ifndef TOSSGAME_H_ #define TOSSGAME_H_ #include <vector> class Player; class TossGame { private: std::vector<Player *> players; public: TossGame(); void play(); virtual ~TossGame(); }; #endif /*TOSSGAME_H_*/
// Coin.cpp #include "Coin.h" std::ostream& operator<< ( std::ostream &o, Side s) { if (s == HEADS) o << "heads"; else o << "tails"; return o; }
// ComputerPlayer.cpp #include "ComputerPlayer.h" #include <cstdlib> void ComputerPlayer::makeBet() { if (rand()%2==0) bet = HEADS; else bet = TAILS; } ComputerPlayer::ComputerPlayer(std::string s) : Player(s) { bet = HEADS; }
// HumanPlayer.cpp #include "HumanPlayer.h" #include <iostream> using namespace std; void HumanPlayer::makeBet() { char c; cout << "Would you like to bet on heads (h) or tails (t) ? "; cin >> c; if (c == 'h') bet = HEADS; else if (c == 't') bet = TAILS; else { cout << "I don't recognize that. I'll just assume tails." << endl; bet =TAILS; } } HumanPlayer::HumanPlayer(string s) : Player(s) { bet = TAILS; } HumanPlayer::HumanPlayer() { cout << "What is your name? "; cin >> this->name; }
// main.cpp #include "TossGame.h" int main() { TossGame g; g.play(); return 0; }
// TossGame.cpp #include "TossGame.h" #include "HumanPlayer.h" #include "ComputerPlayer.h" #include "NetworkPlayer.h" #include <cstdlib> #include <ctime> #include <iostream> using namespace std; TossGame::TossGame() { srand(time(0)); //char x; //unsigned int number; /* cout << "How many players? "; cin >> number; for (unsigned i=0;i<number;i++) { cout << "What type of player?"; cin >> } */ players.push_back(new HumanPlayer()); players.push_back(new ComputerPlayer("Comp")); players.push_back(new ComputerPlayer("AnotherComp")); //players.push_back(new NetworkPlayer()); } TossGame::~TossGame() { for (unsigned int i=0;i<players.size();i++) delete players[i]; } void TossGame::play() { for (unsigned int i=0;i<players.size();i++) { cout << players[i]->getName() << " makes a bet..." << endl; players[i]->makeBet(); cout << players[i]->getName() << " bets on " << players[i]->getBet() << endl; } cout << "Now I flip the coin..." << endl; Side landed = TAILS; if (rand()%2==0) landed = HEADS; cout << "It landed on " << landed << endl; for (unsigned int i=0;i<players.size();i++) { cout << players[i]->getName() << " has "; if (players[i]->getBet()==landed) cout << "won!"; else cout << "lost!"; cout << endl; } }
And the Same without OO:
#include <iostream> #include <ctime> #include <cstdio> #include <vector> using namespace std; enum PlayerType { HUMAN, COMPUTER, NETWORK }; enum Side { HEADS, TAILS }; std::ostream& operator<< ( std::ostream &o, Side s) { if (s == HEADS) o << "heads"; else o << "tails"; return o; } struct Player { PlayerType playerType; string name; Side bet; }; vector<Player *> players; void initializeGame() { srand(time(0)); Player *m = new Player; m->playerType = HUMAN; m->name = "Max"; players.push_back(m); Player *c = new Player; c->playerType = COMPUTER; c->name = "Comp"; players.push_back(c); Player *n = new Player; n->playerType = NETWORK; n->name = "John Doe"; players.push_back(n); } Side betHuman() { Side bet; char c; cout << "Would you like to bet on heads (h) or tails (t) ? "; cin >> c; if (c == 'h') bet = HEADS; else if (c == 't') bet = TAILS; else { cout << "I don't recognize that. I'll just assume tails." << endl; bet =TAILS; } return bet; } Side betComputer() { Side bet; if (rand()%2==0) bet = HEADS; else bet = TAILS; return bet; } void playGame() { for (unsigned int i=0;i<players.size();i++) { cout << players[i]->name << " makes a bet..." << endl; if (players[i]->playerType == HUMAN ) players[i]->bet = betHuman(); else { players[i]->bet = betComputer(); } cout << players[i]->name << " bets on " << players[i]->bet << endl; } cout << "Now I flip the coin..." << endl; Side landed = TAILS; if (rand()%2==0) landed = HEADS; cout << "It landed on " << landed << endl; for (unsigned int i=0;i<players.size();i++) { cout << players[i]->name << " has "; if (players[i]->bet==landed) cout << "won!"; else cout << "lost!"; cout << endl; } } void cleanUp() { for (unsigned int i=0;i<players.size();i++) delete players[i]; } int main() { initializeGame(); playGame(); cleanUp(); return 0; }