Generic Class

◀ Friend Class and Friend Function▶ Traps and Tips
Amazon The main purpose of a generic class is to provide genericity so that the same member function does not need to be rewritten to accept a different type of argument. Different programming languages support genericity in different ways. In C++, a class template is used to provide genericity for a class. The word “template” in C++ in fact is linked to genericity.

The Standard Template Library we will be covering in Chapter 7 is a case in point. Most of you should be well familiar with a template class; if you don’t, consult the Internet or a book for its syntax.

The following is a sample program using a template to represent a two-dimensional array of various types. In main() I create one array of int and one array of char and manipulate them the same way to show you how the template class matrix is written to provide genericity.
#include <iostream>
using namespace std;

/* you can replace <class Type> with <typename Type> */
template <class Type>
class matrix{
private:
  Type **array;
  int rows;
  int cols;
public:
  matrix(int r, int c);
  matrix(matrix & m);  /* copy constructor */
  Type* & operator[](int row) { return array[row]; }
  int getRows() const { return rows; }
  int getCols() const { return cols; }
  void showArray();
};

template <class Type>
matrix<Type>::matrix(int r, int c) {
  rows = r;
  cols = c;
  array = new Type*[r];
  for(int i=0; i<r; i++)
    array[i] = new Type[c];
}

template <class Type>
matrix<Type>::matrix(matrix & m) {
  int i, j;
  delete [] array;
  rows = m.getRows();
  cols = m.getCols();
  array = new Type*[rows];
  for(i=0; i<rows; i++)
    array[i] = new Type[cols];
  for(i=0; i<rows; i++)
    for(j=0; j<cols; j++)
      array[i][j] = m[i][j];
}

template <class Type>
void matrix<Type>::showArray() {
  int i, j;
  for(i=0; i<rows; i++) {
    for(j=0; j<cols; j++)
      cout << array[i][j] << \'\t\';
    cout << endl;
  }
}

int main(){
  int i, j;
  matrix<int> b(10,5);  /* 10-by-5 array */
  matrix<char> d(10,5);

  for(i=0; i<10; i++)
    for(j=0; j<5; j++)
      b[i][j] = i+j;  /* assigning values to every single cell */
  cout << "Here are the contents of b:\n";
  b.showArray();  /* display the array */
  matrix<int> a(b);  /* copy b to a */
  cout << "\nHere are the contents of a:\n";
  a.showArray();

  for(i=0; i<10; i++)
    for(j=0; j<5; j++)
      d[i][j] = \'a\'+i+j;  /* assigning values to every single cell */
  cout << "Here are the contents of d:\n";
  d.showArray();  /* display the array */
  matrix<char> c(d);  /* copy d to c */
  cout << "\nHere are the contents of c:\n";
  c.showArray();

  return 0;
}
Go ahead and add additional functions to this class template so that it can handle row and column additions and deletions.

Pay attention to the syntax of a class template and discern the differences between a class template and a normal class.
The primary use of a class template is, obviously, to accommodate a number of different data types. In most situations, however, a class is designed specifically to work with certain data types. Therefore, don’t get intimidated by a class template; it is not as important as you may think.
◀ Friend Class and Friend Function▶ Traps and Tips

fShare
Questions? Let me know!