Beruflich Dokumente
Kultur Dokumente
Topic #7
CS202 7- 1
Relationship of Objects
Friends, Nesting
Static Members
CS202 7- 2
Friends
CS202 7- 3
Friend Classes
class declaring_class {
friend class class_name1, //class_name1 is a friend
class_name2; //class_name2 is a friend
...
};
CS202 7- 4
Friend Classes
class declaring_class {
//class_name is not previously declared or defined, so
//an incomplete declaration is used
friend class class_name; //class_name is a friend class
...
};
CS202 7- 5
Friend Classes
CS202 7- 6
class declaring_class_name {
friend return_type function_name(arg_list);
};
CS202 7- 7
class declaring_class_name {
friend return_type class_name::function_name(arg_list);
};
CS202 7- 8
CS202 7- 9
Nesting
CS202 7- 10
Nesting
class outer_class {
public:
class nested_class {
public:
nested_class(); //nested class' constructor
...
};
CS202 7- 11
Nesting
CS202 7- 12
Nesting Example
#include "employee.h"
class tree { //binary tree class
public:
class node; //forward reference to node
tree();
//default constructor
tree(const tree &);
//copy constructor
~tree();
//destructor
tree & operator = (const tree &); //assignment op
void insert(const employee &); //insert employee
void write() const;
//write employee info
private:
node* root;
//root node of tree
friend static void copy(node* &, const node*);
friend static void destroy(node*);
friend static tree::node* add(node*, node*);
};
CS202 7- 13
CS202 7- 14
CS202 7- 15
CS202 7- 16
CS202 7- 17
class tree {
private:
node* root;
//root node of tree
static void copy(node* &, const node*);
static void destroy(node*);
static tree::node* add(node*, node*);
static void traverse(const node*);
CS202 7- 18
CS202 7- 19
Static Members
CS202 7- 20
Static Members
CS202 7- 21
CS202 7- 22
be supplied
only once and is usually placed in the class
implementation file. A static data member's
definition must be preceded by the class name and
the scope resolution operator before the static data
member's identifier.
CS202 7- 24
Introduction to C++
Template
Classes
CS202 7- 25
Class Templates
CS202 7- 26
Class Templates
CS202 7- 27
Class Templates
CS202 7- 28
Class Templates
CS202 7- 29
Class Templates
CS202 7- 30
Class Templates
CS202 7- 31
Class Templates
CS202 7- 32
Class Templates
CS202 7- 33
Class Templates
CS202 7- 34
Class Templates
CS202 7- 35
Class Templates
CS202 7- 36
Class Templates
CS202 7- 37
Class Templates
CS202 7- 38
Class Templates
CS202 7- 39
Class Templates
template <class TYPE, int sz>
class stack {
public:
stack();
int push(const TYPE & data);
TYPE & pop();
private:
//this does not instantiated the list class
list <int, 100, stack> list_object;
};
Class Templates
CS202 7- 41
Class Templates
CS202 7- 42
Class Templates
Specializations
CS202 7- 44
Specializations
CS202 7- 45
Class Templates
template <class TYPE> class stack {
private:
TYPE * stack_array;
const int stack_size;
int stack_index;
public:
stack (int size=100): stack_size(size), stack_index(0) { stack_array =
new TYPE[size]; } ...
};
template <class TYPE> void stack<TYPE>::push(TYPE item) {
if (stack_index < stack_size) {
stack_array[stack_index] = item;
++stack_index; } }
//An explicit specialization
template <> void stack <char *>::push(char * item) {
if (stack_index < stack_size) {
stack_array[stack_index] = new char[strlen(item)+1];
strcpy(stack_array[stack_index], item);
++stack_index; } }
CS202 7- 46
Specializations
CS202 7- 47
Class Templates
//primary class template
template <class TYPE1, int sz, template<TYPE1> class TYPE2>
class list {...}
//partial specialization
template <class TYPE1, int sz, template<TYPE1> class TYPE2>
class list <TYPE1 *,sz,TYPE2> {...}
//partial specialization
template <int sz, template<TYPE1> class TYPE2>
class list<list, sz,TYPE2<list>>{...}
//partial specialization
template <template<TYPE1> class TYPE2>
class list<list,100,TYPE2<list>>{...}
//explicit specialization
template <> class list<list,100,list<list>>{...}
CS202 7- 48
Class Templates
template <class TYPE> class stack {
private:
TYPE * stack_array;
const int stack_size;
int stack_index;
public:
stack (int size=100): stack_size(size), stack_index(0) { stack_array =
new TYPE[size]; }
void push(TYPE item);
TYPE pop(void);
};
template <class TYPE> class stack <char *> {
private:
char ** stack_array;
int stack_index;
public:
stack(int size=100): stack_index(0){
stack_array = new char *[size]; } ...
CS202 7- 49
CS202 7- 50
CS202 7- 51
CS202 7- 53
Caution
CS202 7- 54
Caution
CS202 7- 55
Introduction to C++
Template
Functions
CS202 7- 56
Function Templates
CS202 7- 57
Function Templates
//Prototype:
template <class TYPE1, class TYPE2>
void array_copy(TYPE1 dest[], TYPE2 source[], int size);
//A later definition:
template <class TYPE1, class TYPE2>
void array_copy(TYPE1 dest[], TYPE2 source[], int size) {
for(int i=0; i < size; ++i)
dest[i] = source[i];
}
//The client can call this function using:
int int_array1[100], int_array2[100], int_array3[20];
float real_array[100];
char char_array[20];
array_copy(int_array1, int_array2, 100);
array_copy(int_array3, int_array1, 20);
array_copy(real_array, int_array1, 100);
array_copy(int_array1, char_array, 20);
CS202 7- 58
Function Templates
CS202 7- 59
Function Templates
CS202 7- 60
Function Templates
template <class TYPE1, class TYPE2, class TYPE3>
TYPE1 array_copy(TYPE2 dest[], TYPE3 source[], int size) {
for(int i=0; i < size; ++i)
dest[i] = source[i];
}
//client program
char a[100];
char b[20];
cin.getline(b, 20, '\n');
//explicitly specify type dependency for only first type
int result;
result = array_copy<int> (a,b,strlen(b));
CS202 7- 61
Function Templates
CS202 7- 62
Function Templates
CS202 7- 63
Function Templates
template <class TYPE1, class TYPE2> //function template
void array_copy(TYPE1 dest[], TYPE2 source[], int size) {
for(int i=0; i < size; ++i)
dest[i] = source[i];
}
template<> void array_copy(char* dest[], char* source[], int size) {
for(int i=0; i < size; ++i) {
dest[i] = new char[strlen(source[i]) + 1];
strcpy(dest[i], source[i]);
}
}
//This specialized function is called when:
char saying1[] = "Hello World";
char saying2[] = "This is a great day!";
char* s1[2] = {saying1, saying2};
char* s2[2];
array_copy(s2, s1, 2);
CS202 7- 64
CS202 7- 65
CS202 7- 66
Function Templates
template <class TYPE> //qsort.h
inline void swap(TYPE v[], int i, int j) {
TYPE temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
template <class TYPE>
void qsort(TYPE v[], int left, int right) {
if (left < right) {
swap(v, left, (left+right)/2);
int last = left;
for (int i=left+1; i <= right; ++i)
if (v[i] < v[left])
swap(v, ++last, i);
swap(v, left, last);
qsort(v, left, last-1);
qsort(v, last+1, right);
} }
CS202 7- 67
Function Templates
//main.cpp
#include <iostream>
using namespace std;
#include "qsort.h"
int ia[]={46, 28, 35, 44, 15, 22, 19 };
double da[]={46.5, 28.9, 35.1, 44.6, 15.3, 22.8, 19.4};
int main() {
const int isize=sizeof(ia)/sizeof(int);
const int dsize=sizeof(da)/sizeof(double);
qsort(ia, 0, isize-1);
// integer qsort
for(int i=0; i < isize; ++i)
cout << ia[i] << endl;
qsort(da, 0, dsize-1);
for(i=0; i < dsize; ++i)
cout << da[i] << endl;
return (0);
}
CS202 7- 68
// double qsort
Caution
CS202 7- 69
Caution
CS202 7- 70