Object-Oriented Principles and Practice / C++

Similar documents
CPSC 427: Object-Oriented Programming

8.1 The Roles of a Class

CPSC 427: Object-Oriented Programming

Data Structures and Algorithms

Object-Oriented Principles and Practice / C++

Object-Oriented Principles and Practice / C++

CPSC 427: Object-Oriented Programming

Object-Oriented Principles and Practice / C++

Sudoku-4: Logical Structure

Suppose we find the following function in a file: int Abc::xyz(int z) { return 2 * z + 1; }

7.1 Optional Parameters

CPSC 427: Object-Oriented Programming

CPSC 427: Object-Oriented Programming

CS304 Object Oriented Programming Final Term

CS201 Some Important Definitions

Object-Oriented Principles and Practice / C++

Objects, Allocation, and Disasters

Objects, Allocation, and Disasters

Come and join us at WebLyceum

Page. No. 1/15 CS201 Introduction to Programmming Solved Subjective Questions From spring 2010 Final Term Papers By vuzs Team

Quiz Start Time: 09:34 PM Time Left 82 sec(s)

CS201 Latest Solved MCQs

Object-Oriented Programming for Scientific Computing

KOM3191 Object Oriented Programming Dr Muharrem Mercimek OPERATOR OVERLOADING. KOM3191 Object-Oriented Programming

Interview Questions of C++

Short Notes of CS201

CS201 - Introduction to Programming Glossary By

CPSC 427: Object-Oriented Programming

Stream States. Formatted I/O

CISC 2200 Data Structure Fall, C++ Review:3/3. 1 From last lecture:

For Teacher's Use Only Q No Total Q No Q No

Software Engineering Concepts: Invariants Silently Written & Called Functions Simple Class Example

PIC 10B Lecture 1 Winter 2014 Homework Assignment #3

Final exam. Final exam will be 12 problems, drop any 2. Cumulative up to and including week 14 (emphasis on weeks 9-14: classes & pointers)

2 ADT Programming User-defined abstract data types

Object-Oriented Principles and Practice / C++

CS201- Introduction to Programming Current Quizzes

And Even More and More C++ Fundamentals of Computer Science

Collected By Anonymous

Abstract Data Types (ADT) and C++ Classes

CSE 143. Linked Lists. Linked Lists. Manipulating Nodes (1) Creating Nodes. Manipulating Nodes (3) Manipulating Nodes (2) CSE 143 1

CSE 333 Midterm Exam July 24, Name UW ID#

Outline. User-dened types Categories. Constructors. Constructors. 4. Classes. Concrete classes. Default constructor. Default constructor

Documentation. Programming / Documentation Slide 42

NOTE: Answer ANY FOUR of the following 6 sections:

Study Guide to Exam 2

CS201- Introduction to Programming Latest Solved Mcqs from Midterm Papers May 07,2011. MIDTERM EXAMINATION Spring 2010

Intermediate Programming & Design (C++) Classes in C++

POLYMORPHISM 2 PART. Shared Interface. Discussions. Abstract Base Classes. Abstract Base Classes and Pure Virtual Methods EXAMPLE

POLYMORPHISM 2 PART Abstract Classes Static and Dynamic Casting Common Programming Errors

1. In C++, reserved words are the same as predefined identifiers. a. True

CPE 112 Spring 2015 Exam II (100 pts) March 4, Definition Matching (8 Points)

1. Describe History of C++? 2. What is Dev. C++? 3. Why Use Dev. C++ instead of C++ DOS IDE?

IS0020 Program Design and Software Tools Midterm, Fall, 2004

Data Structures and Algorithms

Introduction Of Classes ( OOPS )

Ch. 12: Operator Overloading

Computer Programming & Problem Solving ( CPPS ) Turbo C Programming For The PC (Revised Edition ) By Robert Lafore

Instantiation of Template class

Object-Oriented Principles and Practice / C++

CS304 Object Oriented Programming

QUIZ. What is wrong with this code that uses default arguments?

CPSC 427a: Object-Oriented Programming

Client Code - the code that uses the classes under discussion. Coupling - code in one module depends on code in another module

UNIT- 3 Introduction to C++

Chapter 10. Pointers and Dynamic Arrays. Copyright 2016 Pearson, Inc. All rights reserved.

Chapter 10 Pointers and Dynamic Arrays. GEDB030 Computer Programming for Engineers Fall 2017 Euiseong Seo

Convenient way to deal large quantities of data. Store data permanently (until file is deleted).

COP Programming Assignment #7

Pointers. Addresses in Memory. Exam 1 on July 18, :00-11:40am

Classes in C++98 and C++11

calling a function - function-name(argument list); y = square ( z ); include parentheses even if parameter list is empty!

Operator overloading

CSCI 102L - Data Structures Midterm Exam #1 Fall 2011

LESSON 4. The DATA TYPE char

a data type is Types

Streams - Object input and output in C++

Object-Oriented Principles and Practice / C++

Multiple Choice (Questions 1 14) 28 Points Select all correct answers (multiple correct answers are possible)

Arrays. Lecture 9 COP 3014 Fall October 16, 2017

Pointers, Dynamic Data, and Reference Types

Pointers and Arrays CS 201. This slide set covers pointers and arrays in C++. You should read Chapter 8 from your Deitel & Deitel book.

CS 142 Style Guide Grading and Details

CMSC 202 Section 010x Spring Justin Martineau, Tuesday 11:30am

EINDHOVEN UNIVERSITY OF TECHNOLOGY Department of Mathematics and Computer Science

CS3157: Advanced Programming. Outline

double d0, d1, d2, d3; double * dp = new double[4]; double da[4];

Programming in C++ Prof. Partha Pratim Das Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur

while for do while ! set a counter variable to 0 ! increment it inside the loop (each iteration)

CSC 210, Exam Two Section February 1999

CS 231 Data Structures and Algorithms, Fall 2016

Creating a C++ Program

INITIALISING POINTER VARIABLES; DYNAMIC VARIABLES; OPERATIONS ON POINTERS

Exercise 1.1 Hello world

2.1 Introduction UML Preliminaries Class diagrams Modelling delegation... 4

Chapter-8 DATA TYPES. Introduction. Variable:

CMSC162 Intro to Algorithmic Design II Blaheta. Lab March 2019

Construction and Destruction

Lecture 14: more class, C++ streams

G52CPP C++ Programming Lecture 14. Dr Jason Atkin

Transcription:

Object-Oriented Principles and Practice / C++ Alice E. Fischer May 4, 2013 OOPP / C++ Lecture 6... 1/34

Initialization: TestInit Disasters Failure: Symptoms, Causes, and Cures End of File and Error Handling Bar Graph: an Example Specification and Modeling graph.hpp graph.cpp row.hpp row.cpp OOPP / C++ Lecture 6... 2/34

C++ gives us several ways to initialize class data members. A data member may be initialized in the class declaration. There are special rules for initialization of static class members because they must be initialized at load time. A member may be initialized by a ctor prior to execution of a constructor. A member may be initialized by a constructor. C++11 introduced the third and fourth options. OOPP / C++ Lecture 6... 3/34

Initialization in the Class Declaration class Tester { private: // primitive types ======================== int n1 = -1; static const int n3 = 17; // class types ============================ Item it1, it2; Item it3 = {.99, 1}; const Item it4 = {2, 2}; OOPP / C++ Lecture 6... 4/34

C++11 gives us new ways to initialize arrays. class Tester { private: static int a0[3]; static constexpr int a1[3]{1,2,3}; int a2[3] = {8}; int a3[3]; int* a4; int* a5 = new int[3]{5,6,7}; public: Tester(): it2{.5, 2}, a3(), a4(new int[3]{7,8,9}) {} } const int Tester::a1[3]; int Tester::a0[3]{4,5,6}; OOPP / C++ Lecture 6... 5/34

These things do not compile. A const is something that is constant at block-entry time. A constexpr is an expression that is constant at compile time. Error: non-const static data member must be initialized out of line. static int n2 = 99; Error: constexpr variable it5 must be initialized by a constant expression static constexpr Item it5 = {1.01, 10}; Error: in-class initializer for static data member of type const int [3] requires constexpr specifier. static const int a1[3]1,2,3; OOPP / C++ Lecture 6... 6/34

Failure: Symptoms, Causes, and Cures Disasters Chapter 6 and Chapter 3.7 Five Kinds of Failure Causes and Cures End of File and Error Handling OOPP / C++ Lecture 6... 7/34

Failure: Symptoms, Causes, and Cures Five Kinds of Failure Memory management error: failure to allocate or deallocate at the right time. Amnesia: it WAS stored there, but now it is gone. Bus error: attempt to access a machine location that does not exist. Segmentation error: attempt to access a machine location that belongs to someone else. Waiting for eternity: no progress is happening. OOPP / C++ Lecture 6... 8/34

Failure: Symptoms, Causes, and Cures Causes and Cures Shallow copy / deep delete. Dangling pointers. Storing things in limbo. The wrong way to delete. Walking on memory. Parentheses are not square brackets. NULL pointers Stream input errors. OOPP / C++ Lecture 6... 9/34

Failure: Symptoms, Causes, and Cures In-class Examples. Assign Dangle Limbo Delete Walk Brackets OOPP / C++ Lecture 6... 10/34

End of File and Error Handling Stream State Flags See Chapter 3.7. Three flags are part of every stream object: Normal, good read. rdstate() returns 0 good() returns true fail eof bad 0 0 0 Conversion error occurred. rdstate() returns 4 good() returns false Hardware error occurred. rdstate() returns 5 good() returns false fail eof bad 1 0 0 fail eof bad 1 0 1 End of file occurred but data was read. rdstate() returns 2 good() returns false End of file occurred no data was read. rdstate() returns 2 good() returns false fail eof bad 0 1 0 fail eof bad 1 1 0 OOPP / C++ Lecture 6... 11/34

End of File and Error Handling Using the Stream Bits To handle all possible situations, make tests in the right order. for(;;) { instr >> number; if (instr.good()) cout <<number <<endl; // process item. else if (instr.eof() ) break; else if (instr.fail()) { // Without these three lines, instr.clear(); // an alphabetic input char instr.ignore(1); // causes an infinite loop. } else if (instr.bad()) // Abort if unrecoverable. fatal( "Bad error while reading input stream." ); } OOPP / C++ Lecture 6... 12/34

Bar Graph: an Example Chapter 8.3 Specification and Data Structure The main program Class Item Class Graph OOPP / C++ Lecture 6... 13/34

Specification and Modeling Model and Viewer A client typically provides a good description of the input for a project and a rough description of the desired functionality. A designer s specification gives an unambiguous description of the input, the desired functionality, and the output. We can, and often do, display the output in more than one way: those ways are called views of the data. Underneath all the views is a model of the data. A model is the set of variables that stores and organizes all the information necessary to create one or more views. A skilled program designer selects a model that will store the information efficiently, will perform acceptably well at run time, and will be easy for the coder to use. OOPP / C++ Lecture 6... 14/34

Specification and Modeling Associate Aggregate Compose Suppose you have two classes, A and B, and that each A object contains two B objects. If the two B s are part of the memory area allocated for A (no pointers here) then A composes B. The B object is born and dies with the A object. If the two B s can exist before A is created and A s constructor initializes A to points to them, then A aggregates B. The three parts were not born at the same time, but A is not a complete object unless it points at two B s. If the B s can be created either before or after A, and A can be complete whether it points to zero, one or two of them, then A associates with B. OOPP / C++ Lecture 6... 15/34

Specification and Modeling The Bar Graph App A teacher I know likes to see the student exam scores spread out on a bar graph. She wants a program that will take a file of student initials and scores (0..100), and display them with one line per 10-point group. She provided the following I/O guidance for the developer. She says that the order of the scores on a given line does not matter. The developer s job is to create a model that can store the data efficiently and an output display that the teacher will like. OOPP / C++ Lecture 6... 16/34

Specification and Modeling Bar graph sample input and output Input: Output: AWF 00 MJF 98 FDR 75 RBW 69 GBS 92 PLK 37 ABA 56 PDB 71 JBK -1 GLD 89 PRD 68 HST 79 ABC 82 AEF 89 ALA 105 Name of data file: exam1.txt 00..09: AWF 0 10..19: 20..29: 30..39: PLK 37 40..49: 50..59: ABA 56 60..69: PRD 68 RBW 69 70..79: HST 79 PDB 71 FDR 75 80..89: AEF 89 ABC 82 GLD 89 90..99: GBS 92 MJF 98 Errors: ALA 105 JBK -1 Average score (excluding errors): 69.6 OOPP / C++ Lecture 6... 17/34

Specification and Modeling Modeling a Bar Graph Clearly, this is more than the simple bar graphs that can be made using a spreadsheet. To model it we need: A class to store the information for one student (4 chars and one int). A class to represent one row of the display, with a label and a variable number of students on its list. The list of student scores could be a vector or a linked list. A linked list was chosen. A class to represent all the rows and the row for errors. Clearly, this should be an ordinary array because we know exactly how many rows are needed. OOPP / C++ Lecture 6... 18/34

Specification and Modeling Bar graph data structure We will build this data structure: curve 0 1 2 3 4 5 6 7 8 9 10 "00..09: " "10..19: " "20..29: " "30..39: " "40..49: " "50..59: " "60..69: " "70..79: " "80..89: " "90..99: " "Errors: " Label Head "AWF" 00 Initials Score Data Next "MJF" 98 OOPP / C++ Lecture 6... 19/34

Specification and Modeling Notes on the Data Structure Diagram A data structure diagram shows the relationships, at one moment of runtime, among the objects in the model. Our Graph consists of an array of pointers to Rows. Each row is a linked list of Cells. Each cell composes three initials and a score. We say that the Graph aggregates the Rows because they are associated with the Graph but are not contained within it. The Rows must be allocated and initialized when the Graph is created and deallocated when the Graph is destroyed. This is done with constructors and destructors. OOPP / C++ Lecture 6... 20/34

Specification and Modeling UML Diagram Graph - Bar: Row* [ 11 ] + Graph( istream& ) + ~Graph() + Insert( char*, int ) + Print( ostream& ): ostream& operator << 11 Row -Label: char[10] -Head: Cell* + Row ( int ) + ~Row () + Insert( char*, int ) + Print( ostream& ): ostream& 1 operator << Cell * - Data: Item* - Next: Cell* - Cell( Item*, Cell* ) - ~Cell () * 1 Item - Initials: char[4] - Score: int - Item( char*, int ) - ~Item - Print ( ostream& ): ostream& operator << OOPP / C++ Lecture 6... 21/34

Specification and Modeling Notes on the UML Diagram A UML diagram shows the static relationships among the classes in an application. Graph is the primary, or first, class for this application. Each class is represented by a rectangle with 3 (sometimes 4) layers: Name, data members, function members, and associated other things. Row, Cell, and Item are the other classes. Row and Cell, together, implement the linked list. The line connecting Graph to Row has a white diamond on one end and 11 on the other. This indicates that Graph aggregates 11 Rows. OOPP / C++ Lecture 6... 22/34

Specification and Modeling More Notes on the UML Diagram The Row and Cell classes are enclosed in a gray box. This indicates that they are a tightly-coupled pair of classes, and that one of these classes gives friendship to the other. The asterisk on the line from Row to Cell tells you that Row is the master and Cell is the slave: Each Row has many Cells. The line with no diamond on the end represents association. The line connecting Cell to Item has a white diamond and a 1 on it. This means that each Cell aggregates one Item. Members marked by + are public, those marked by are private. OOPP / C++ Lecture 6... 23/34

Specification and Modeling Bar Graph: main program Page 82 This program reads a file of exam data and prints a bar-graph of results. Each data line consists of a student s 3 initials and a score between 0 and 100. The main program interacts with the user to print instructions, get the file name, and opens the input stream. It then creates a Graph object (line 23) and prints the resulting graph (line 25). All of the action occurs within the Graph class and other classes. Main programs should be kept short, like this, or even shorter. Note the call on the static class function on line 14. OOPP / C++ Lecture 6... 24/34

graph.hpp class Graph { private: Row* bar[bars]; // List of bars (aggregation) void insert( char* name, int score ); public: Graph ( istream& infile ); ~Graph(); ostream& print ( ostream& out ); // Static functions are called without a class instance static void instructions() { cout << "Put input files in same directory " "as the executable code.\n"; } }; inline ostream& operator<<( ostream& out, Graph& G) { return G.print( out ); } OOPP / C++ Lecture 6... 25/34

graph.hpp Notes: graph.hpp A graph is defined here as an array of 11 bar pointers, where each bar will store student scores in a single 10-point range. (Page 86) A Graph consists of an array of pointers to bars. We could use an array of Rows instead, and will look at this alternative next week. We say that it aggregates the bars because they are associated with the Graph but are not contained within it. The bars must be allocated when the Graph is created and deallocated when the Graph is destroyed. This is done with constructors and destructors. istream. OOPP / C++ Lecture 6... 26/34

graph.hpp Graph class declaration, continued Page 86 The only constructor builds a Graph by reading an open The method insert is used by the constructor and should not be used anywhere else. Hence it is declared private. It computes which bar an exam score belongs to and then puts it there. A public static function is provided to print instructions. The intention is that this function should be called before calling the class constructor. The instructions function is called using Graph::instructions(). OOPP / C++ Lecture 6... 27/34

graph.cpp Notes: graph.cpp Graph::Graph( istream& infile ) { char initials[4]; int score; // Create bars for (int k=0; k<bars; ++k) bar[k] = new Row(k); // Fill bars from input stream for (;;) { infile >> ws; // Skip leading whitespace before get. infile.get(initials, 4, ); // Safe read. if (infile.eof()) break; infile >> score; // No need for ws before >> num. insert (initials, score); // *** POTENTIAL INFINITE LOOP } } OOPP / C++ Lecture 6... 28/34

graph.cpp Notes: graph.cpp continued Pages 86 87 The constructor builds the entire graph. This is a 12-line function, quite long for a constructor. An alternative design would be to move the file input loop into a separate, private getscores function and call it from the constructor. Graph() first creates 11 bars and links them to the spine bar[]. This forms a 2D array. Graph() next reads the scores and fills the graph. ws skips over leading whitespace. get(initials, 4, ) is a safe way to read initials. OOPP / C++ Lecture 6... 29/34

graph.cpp Graph class implementation, continued. Because the graph is declared as an array of row pointers, the Graph destructor contains a loop to delete 11 Row*s. If the class used Rows instead of Row*s, this delete loop would be unnecessary (and wrong). The insert function is private because it will be called from the constructor and should not be called at any other time. insert() divides the scores 0... 99 into 10 intervals, to find which bar each score belongs in. It then calls the insert() function for the chosen bar. This kind of cooperation is called delegation. Each class does the part of the job that lies within its expertise, and lets the other class do the rest. print() delegates the printing of each bar to Row::print(). OOPP / C++ Lecture 6... 30/34

row.hpp Private class for use by Row. Note friend declaration and private constructor. class Cell { friend class Row; private: Item* data; // Pointer to one data Item (Aggregation) Cell* next; // Pointer to next cell in row (Association) }; Cell (char* d, int s, Cell* nx) { data = new Item(d, s); next = nx; } ~Cell (){ delete data; cerr <<" Deleting Cell " <<"\n"; } OOPP / C++ Lecture 6... 31/34

row.hpp Public class represents one bar of the bar graph class Row { // Interface class for one bar of the bar graph. private: char label[10]; // Row header label Cell* head; // Pointer to first cell of row public: Row ( int n ); ~Row (); void insert ( char* name, int score ); // delegation ostream& print ( ostream& os ); }; OOPP / C++ Lecture 6... 32/34

row.hpp Notes: row.hpp A Row is a list of Item. It is implemented by a linked list of Cell. A public class with a private helper class is a common design pattern for containers where one container holds many items. The Cell class is private to Row. Nothing but its name is visible from the outside. friend class Row allows Row functions to access the private parts of Cell. Since all constructors of Cell are private, any attempt to allocate a Row from outside will fail. Row::head points to the first cell of the linked list. A Cell is created is created, initialized, and inserted into linked list in one line! OOPP / C++ Lecture 6... 33/34

row.cpp Notes: row.cpp Row k is labeled by the length 9 string k0..k9: k = 4 label is 40..49:. Label is produced by a safe copy-and-modify trick: strcpy( label, " 0.. 9: " ); label[0] = label[4] = 0 + rownum;. E.g., 0 +rownum converts an integer in [0..9] to the corresponding ASCII digit. Assignment in C++ returns the L-value of its left operand. In C, it returns the R-value of its right operand. OOPP / C++ Lecture 6... 34/34