0% found this document useful (0 votes)
92 views

C++ Classes and OO More Examples HW2

The document discusses C++ classes and object-oriented programming concepts such as constructors, destructors, and memory management using new and delete. It provides examples of declaring a Point class with a constructor, using the this pointer, and overloading constructors. It also covers linked lists implemented as a class with a prepend method, destructors to deallocate memory, and breadth-first search to check if a graph is connected.

Uploaded by

navediitr
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
92 views

C++ Classes and OO More Examples HW2

The document discusses C++ classes and object-oriented programming concepts such as constructors, destructors, and memory management using new and delete. It provides examples of declaring a Point class with a constructor, using the this pointer, and overloading constructors. It also covers linked lists implemented as a class with a prepend method, destructors to deallocate memory, and breadth-first search to check if a graph is connected.

Uploaded by

navediitr
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 57

C++ and OO

C++ classes and OO

More Examples

HW2

C++ for C Programmers by Ira Pohl

Objects

C++ for C Programmers by Ira Pohl

C++ and OO

What happens with a declaration


l
l
l

int i , j = 3;
Declares; allocates ; initializes
For a simple native type this happens
automatically via a stack

Constructor the OO function to do this

C++ for C Programmers by Ira Pohl

Quiz- what is printed


l
l
l
l
l
l
l

int main()
{ int i = 9, j = 3;
cout << i is << i << j is << j <<endl;
{ int i = j + 2;
cout << i is << i << j is << j <<endl;
cout << i is << i << j is << j <<endl;
}

C++ for C Programmers by Ira Pohl

Answer
l

i is 9 j is 3

i is 5 j is 3

i is 9 j is 3

C++ for C Programmers by Ira Pohl

Point and its constructor


class point{
public:
point(x=0.0, y = 0.0):x(x),y(y){} //constructor
double getx(){return x;}
void setx(double val){x = v;}
..
private:
double x, y;
};
//note class_name():initializer list syntax

C++ for C Programmers by Ira Pohl

This pointer --self-referential


l

Every class object has the implicit pointer


l

Keyword this associate with it.

We will use it in the next slide

C++ for C Programmers by Ira Pohl

A special method -constructor


l

point(){ x = y = 0.0;}

or
l point(){ this -> x = 0.0; this ->y = 0.0}
l Or best
l point():x(0.0),y(0.0){}
l

Default constructor the constructor whose


signature is void.

C++ for C Programmers by Ira Pohl

Use
l

point p, q, r; // all call constructor of void signature

C++ for C Programmers by Ira Pohl

Constructor overloading
l

It is useful to have multiple ways to initialize


an object like point.

point(double x, double y)
l {this -> x = x; this ->y = y;}
l

this used to disambiguate

C++ for C Programmers by Ira Pohl

Argument and member confusion


point(double x, double y)
l {this -> x = x; this ->y = y;}
l

This lets ambiguity be resolved x=x; would not work


l Better use initialization syntax
l point(double x, double y):x(x),y(y){}
l

C++ for C Programmers by Ira Pohl

More Constructors
Constructors: Initialize
Constructors: Convert
Constructors: Allocate
Also: constructors can check for correctness

C++ for C Programmers by Ira Pohl

Memory management
new - allocator -think malloc()
l delete deallocator think free()
l

Both work with a heap heap is dynamically


allocated memory unlike Java not
automatically garbage collected

C++ for C Programmers by Ira Pohl

Simple use of new


char* s = new char[size];//get off heap
l int *p = new int(9); // single int initialized
l delete [] s; //delete an array
l delete p; //delete single element
l

These will get used with dynamic data structures


in constructors and destructors

C++ for C Programmers by Ira Pohl

~ destructor
l

Deallocator when item goes out of scope

Syntax within class ~classname(){ }

Typical use is for calling delete to deallocate


to the heap what if you forget
l Answer: Bad manners -memory leak
l

C++ for C Programmers by Ira Pohl

Linked List p 168 section5.7


l

struct slistelem{ char data; slistelem* next;}

class slist{ //singly linked list


public:
slist():h(0){} //empty list
~slist() {release();} destructor
..more methods
private:
slistelem* h; //list head
}

l
l
l
l
l
l
l

C++ for C Programmers by Ira Pohl

Prepend to slist
l
l
l
l
l
l
l
l

void slist::prepend (char* c)


{
slistelem* temp = new slistelem;
assert (temp != 0);
temp -> next = h; //single link
temp -> data = c;
h = temp; //update h
}

C++ for C Programmers by Ira Pohl

~ destructor
slist::~slist()
l {
l
cout << destructor called << endl;
l
//just for demonstration debug
l
release(); //march thru list with
l
//deletes
l }
l

C++ for C Programmers by Ira Pohl

HW2 some ideas


l

HW2 : implement Dijkstra algorithm and use


a randomly generated graph to test it.

A simpler problem is to compute if a graph is


one connected component

Draw Unconnected graph

C++ for C Programmers by Ira Pohl

Unconnected graph
O

C++ for C Programmers by Ira Pohl

O
O

Connected graph
O

C++ for C Programmers by Ira Pohl

O
O

First draw a randomly generated


Graph
bool** graph;
l
srand(time(0));//seed rand()
l
graph = new bool*[size];
l
for(int i = 0; i <size; ++i)
l
graph[i] = new bool[size];
l //heap created 2 D array of Bool
l

C++ for C Programmers by Ira Pohl

Density is 0.19
l
l
l
l

for (int i = 0; i < size; ++i)


for(int j = i; j < size; ++j)
if (i == j) graph[i][j]= false; //no loops
else graph[i][j] = graph[j][i] = (prob() < 0.19);

C++ for C Programmers by Ira Pohl

Quiz:
l

If the density is 0 the graph has no ____

If the density is 1 the graph is c..

If the density is fixed say 0.1 then as the size


of the graph gets larger it is ____likely to be
connected.

C++ for C Programmers by Ira Pohl

Answer:
l

If the density is 0 the graph has no edges

If the density is 1 the graph is complete

If the density is fixed say 0.1 then as the size


of the graph gets larger it is more likely to be
connected.

C++ for C Programmers by Ira Pohl

The is_connected algorithm


l

//This algorithm is a form of breadth first search - first


implemented by the author in 1968 at SLAC.

//It was in PL1 and was a package of routines for


computational graph theory.

//See also the Wikipedia on Breadth First Search.

//The algorithm is_connected uses a Boolean matrix


representation of an undirected graph to determine if a
graph is connected.

C++ for C Programmers by Ira Pohl

Details

l
l
l
l

It starts with node 0 and determines which nodes can be reached


from this node
placing them in an open set and placing node 0 as the first node
of a connected component.
Each iteration adds one node to the closed set.
This stops with either no furter nodes reachable and
is_connected is false or all nodes being included in the closed
set.
The algorithm was published as a SLAC report and later a
generalizion was published by Hopcroft and Tarjan in 1973.

C++ for C Programmers by Ira Pohl

Is_connected
l
l

bool is_connected(bool *graph[], int size)


{

l
l
l
l
l
l
l

int old_size =0, c_size = 0;


bool* close = new bool[size];
bool* open = new bool[size];
for(int i = 0; i < size; ++i)
open[i] = close[i] = false;
open[0] = true;

C++ for C Programmers by Ira Pohl

At this point
Open set has node 0 on it
l Question would this work if other node is
selected
l

Nothing in closed set.

Each iteration will add one node to closed set

C++ for C Programmers by Ira Pohl

Add to close
l
l
l
l
l

while(c_size < size){


for (int i = 0; i < size; ++i){
old_size = c_size;
if (open[i] && (close[i] == false)){
close[i] = true; c_size++;

C++ for C Programmers by Ira Pohl

Add to open
for(int j = 0; j < size; ++j)
l
open[j] = open[j] || graph[i][j];
l
}
l
}
l

C++ for C Programmers by Ira Pohl

Are we done?
l
l

We are done if have all nodes in close set


Or if no nodes available in open set
if (c_size == size) return true;
if (old_size == c_size) return false;
}
}

C++ for C Programmers by Ira Pohl

L6 Lists

List and code

C++ for C Programmers by Ira Pohl

List Element
l

struct list_element{
list_element(int n = 0, list_element* ptr = 0):
d(n), next(ptr){}
int d;
list_element* next;
};

Or equivalently
l
l

class list_element{
public:
list_element(int n = 0, list_element* ptr = 0):
d(n), next(ptr){}
int d;
list_element* next;
};

C++ for C Programmers by Ira Pohl

Quiz
l

In the previous list_element constructor, what


is 0 used for?

C++ for C Programmers by Ira Pohl

Ans: Null Pointer


l

The zero value is the null pointer value.

Recall it is important in lists to test for null;


they are used as sentinel values.

C++11 - list_element* ptr =nullptr ;


l new keyword - type safe
l

C++ for C Programmers by Ira Pohl

List
l

class list{
public:
list():head(0), cursor(0){}
void prepend(int n); //insert at front value n
int get_element(){return cursor->d;}
void advance(){ cursor= cursor-> next;}
void print();
private:
list_element* head;
list_element* cursor;
};

C++ for C Programmers by Ira Pohl

prepend
l

void list::prepend(int n)
{ if (head == 0)//empty list case
cursor = head = new list_element(n,
head);
else//add to front -chain
head = new list_element(n, head);
}

C++ for C Programmers by Ira Pohl

Quiz : prepend(5)
l

Draw how prepend (5) would work.

Assume a two element list

C++ for C Programmers by Ira Pohl

-> 7 -> 3 ##

Answer
l

5 is on the front of the new list

Draw here----

C++ for C Programmers by Ira Pohl

Print() chaining
l

Void list:: print(){


list_element* h = head;
while(h != 0){//idiom for chaining
cout << h->d << ", ";
h = h -> next;
}
cout << "###" << endl;
}

Should know how to use recursion


Should know how to overload << for list

C++ for C Programmers by Ira Pohl

Use of list
l

int main()
{
list a, b;
a.prepend(9); a.prepend(8);
cout << " list a " << endl;
a.print();
for (int i = 0; i < 40; ++i)
b.prepend(i*i);
cout << " list b " << endl;
b.print();
}

What gets printed?

C++ for C Programmers by Ira Pohl

Q: What gets printed


l

Follow previous code

C++ for C Programmers by Ira Pohl

Ans:
l

Simulate here:(run)

C++ for C Programmers by Ira Pohl

More elaborate

class list{
public:
list():head(0), cursor(0){}
list(const int* arr, int n);
list(const list& lst);//copy constructor
...
~list(); //delete
private:
list_element* head;
list_element* cursor;
};

Deep copy v. referential copy

C++ for C Programmers by Ira Pohl

Deep: Pi is transcendental

C++ for C Programmers by Ira Pohl

Shallow: Moms pie is tasty

C++ for C Programmers by Ira Pohl

Deep v. Shallow
l

First we will examine the copy constructor. We


want to build an equivalent list that is a "deep"
copy.

A "shallow copy would be a referential copy where


the new list head would be the same value as the
old list head.

Shallow copy is a highly efficient form of copying


(why?) but has a more limited utility than a deep
copy(why?).

C++ for C Programmers by Ira Pohl

Copy constructor
l

list::list(const list& lst){


if (lst.head == 0)
{
head =0; cursor =0;
}
else
set up
for( cursor = lst.head; cursor != 0; )
{
chain and create
}
cursor = head;
}
}

C++ for C Programmers by Ira Pohl

More code
l

else
{
cursor = lst.head;
list_element* h = new list_element();
list_element* previous;
head = h;
h->d = lst.head->d;
previous = h;

C++ for C Programmers by Ira Pohl

Chain and create


l

for( cursor = lst.head; cursor != 0; )


{
h = new list_element();
h->d = cursor->d;
previous->next = h;
cursor = cursor->next;
previous = h;
}
cursor = head;
}

C++ for C Programmers by Ira Pohl

~ destructor
l

list::~list()
{
for( cursor = head; cursor != 0; )
{
cursor = head->next;
delete head;
head = cursor;
}
}
Here the destructor chains through the list
returning each list_element created by a
corresponding new.

C++ for C Programmers by Ira Pohl

Use this list


l

int main()
{
list a, b;
int data[10] = {3,4, 6, 7, -3, 5};
list d(data, 6);
list e(data, 10);
a.prepend(9); a.prepend(8);
cout << " list a " << endl;
a.print();

C++ for C Programmers by Ira Pohl

for (int i = 0; i < 40; ++i)


b.prepend(i*i);
cout << " list b " << endl;
b.print();
list c(b);
c.print();
d.print();
e.print();
}
Make sure you know where each constructor and
destructor is invoked. Also what is printed?

C++ for C Programmers by Ira Pohl

Dynamic data Structures in


STL
The standard template library has the
following data structures available and you
are free to use them in your problem:
l #include <vector>
l
can then use vector<type> name(size);
l
vector is the most used it is nearly
efficient as araw array and is safer and
expandable.
l

C++ for C Programmers by Ira Pohl

List is also available


#include <list>
l gets you doubly linked lists
l

C++ for C Programmers by Ira Pohl

C++ More

HW2 Questions?
l
l
l

How to average in disconnected graphs


ignore them for averaging
Density is for entire set of edges does not mean node degree is
uniform; also for small graphs a low density leads to graph being
disconnected.

Review end of chapter short questions

C++ for C Programmers by Ira Pohl

You might also like