|
1
|
- Instructor: Brian M. Dennis
- Teaching Assistants:
- Tom Lechner, Bin Lin, Rachel Goldsborough
- http://www.cs.northwestern.edu/~bmd/cs211/
|
|
2
|
- Initialization
- Not guaranteed
- Done by hand
- Packaging datatypes & behavior
- Reuse / extension
|
|
3
|
- // An example of declaring
- // a new user defined type, using the class mech
- class MLBPlayer {
- public:
- MLBPlayer(char* name, char* team);
- private:
- enum Hit { SINGLE = 0, DOUBLE, TRIPLE, HOMER };
- char* name;
- char* team;
- int at_bats;
- int walks;
- int hits[4];
- float batting_average;
- bool bats_lefty;
- };
|
|
4
|
- #include "MLBPlayer.h"
- #include <cstring>
- MLBPlayer::MLBPlayer(char* n, char* t)
- {
- int cnt = strlen(n) + 1;
- name = new char[cnt];
- strcpy(name, n);
- cnt = strlen(t) + 1;
- strcpy(team, t);
- at_bats = walks = 0;
- bats_lefty = false;
- batting_average = 0.0;
- for (int i = 0; I < 4; i++) { hits[i] = 0; };
- }
|
|
5
|
- // Moving some private fields to public for convenience
- class MLBPlayer {
- public:
- MLBPlayer(char* name, char* team);
- int at_bats;
- int walks;
- float batting_average;
- private:
- enum Hit { SINGLE = 0, DOUBLE, TRIPLE, HOMER };
- char* name;
- char* team;
- int hits[4];
- bool bats_lefty;
- };
|
|
6
|
- #include <iostream>
- using namespace std;
- #include "MLBPlayer.h"
- // Accessing public member variables
- int main(int argc, char* argv[]) {
- MLBPlayer sammy_sosa("Sammy Sosa", "Chicago Cubs");
- MLBPlayer* bmd_wishes = &sammy_sosa;
- sammy_sosa.at_bats = 1;
- int total_hits = 0;
- for (int i = 0; i < 4; i++) {
- total_hits = sammy_sosa.hits[i];
- };
- bmd_wishes->batting_average =
- total_hits / bmd_wishes->at_bats;
- return 0;
- }
|
|
7
|
- // Instead of public fields, let's write public accessor funcs
- class MLBPlayer {
- public:
- MLBPlayer(char* name, char* team);
- enum Hit { SINGLE = 0, DOUBLE, TRIPLE, HOMER };
- int totalHits();
- float battingAverage();
- void addHit(int hit);
- void strikeout();
- private:
- char* name; char* team;
- int at_bats; int walks;
- int hits[4];
- float batting_average;
- bool bats_lefty;
- };
|
|
8
|
- int MLBPlayer::totalHits() {
- int hits_count = 0;
- for (int i = 0; i < 4; i++) {
- hits_count += hits[i];
- }
- return hits_count;
- }
- void MLBPlayer::addHit(int hit) {
- at_bats++;
- if ((SINGLE <= hit) && (hit <= HOMER)) {
- hits[hit] += 1;
- }
- }
|
|
9
|
- float MLBPlayer::battingAverage() {
- return totalHits() / (at_bats * 1.0f);
- }
- void MLBPlayer::strikeout() {
- at_bats++;
- }
|
|
10
|
- #include <iostream>
- using namespace std;
- #include "MLBPlayer.h"
- // Now using public accessor functions
- int main(int argc, char* argv[]) {
- MLBPlayer sammy_sosa("Sammy Sosa", "Chicago Cubs");
- MLBPlayer* bmd_wishes = &sammy_sosa;
- sammy_sosa.addHit(MLBPlayer::SINGLE);
- sammy_sosa.strikeout();
- sammy_sosa.strikeout();
- float ba = sammy_sosa.battingAverage();
- return 0;
- }
|
|
11
|
- #include <iostream>
- using namespace std;
- #include "MLBPlayer.h"
- // Now using public accessor functions
- int main(int argc, char* argv[]) {
- MLBPlayer sammy_sosa("Sammy Sosa", "Chicago Cubs");
- MLBPlayer* bmd_wishes = &sammy_sosa;
- bmd_wishes->addHit(MLBPlayer::SINGLE);
- bmd_wishes->strikeout();
- bmd_wishes->strikeout();
- float ba = bmd_wishes->battingAverage();
- return 0;
- }
|
|
12
|
- // Use overloading to define default constructor
- class MLBPlayer {
- public:
- MLBPlayer(char* name, char* team);
- MLBPlayer();
- enum Hit { SINGLE = 0, DOUBLE, TRIPLE, HOMER }; int totalHits();
- float battingAverage();
- void addHit(int hit);
- void strikeout();
- private:
- char* name; char* team;
- int at_bats; int walks;
- int hits[4];
- float batting_average;
- bool bats_lefty;
- };
|
|
13
|
- #include "MLBPlayer.h"
- // Stuff elided
- MLBPlayer::MLBPlayer() {
- char* n = "Joe Schlabotnik";
- char* t = "Waffletown Syrups";
- int cnt = strlen(n) + 1;
- name = new char[cnt];
- strcpy(name, n);
- cnt = strlen(t) + 1;
- strcpy(team, t);
- at_bats = walks = 0;
- bats_lefty = false;
- batting_average = 0.0;
- for (int i = 0; i < 4; i++) { hits[i] = 0 };
- }
|
|
14
|
- #include <iostream>
- using namespace std;
- #include "MLBPlayer.h"
- int main(int argc, char* argv[]) {
- // Imagine all our old stuff here.
- MLBPlayer black_sox[9];
- MLBPlayer* joe_s = new MLBPlayer;
- joe_s = new MLBPlayer();
- joe_s = new MLBPlayer("Joe Schlabotnik", "Waffletown
Syrups");
- return 0;
- }
|
|
15
|
- #include <cstring>
- // Leaves us with a dangling pointer, also wastes space
- char* dup_string(char* s) {
- const int max_buf = 1024;
- char buf[max_buf];
- strcpy(buf, s);
- return buf;
- }
- // Using dynamic allocation we're okay
- char* dup_string(char* s) {
- int cnt = strlen(s) + 1;
- char* new_string = new char[cnt];
- return new_string;
- }
|
|
16
|
- Take away
- Classes are an improved form of structs
- Know how to declare classes, define member functions
- Dynamic allocation
- Space managed by program at run time
- Binary representations
|