CIS 22
Data Structures
The Canonical Form of a Class Template


Why a Canonical Form?

The C++ Canonical Class Template Form

Canonical Form for a Class (non-template)
file adt.h
#ifndef ADT_H #define ATD_H #include <iostream> using namespace std; class ADT { friend ostream &operator <<(ostream &, const ADT &); friend istream &operator >>(istream &, ADT &); public: ADT(void); ADT(const ADT &); ~ADT(); ADT &operator =(const ADT &) bool operator ==(const ADT &); ... private: ... }; #endif
file adt.cpp
#include <iostream> #include "adt.h" ostream &operator <<(ostream &os, const ADT &adt) { ... return os; } istream &operator >>(istream &is, ADT &adt) { ... return is; } ADT::ADT(void) {...} ADT::ADT(const ADT &source) {...} ADT::~ADT() {...} ADT &ADT::operator =(const ADT &rhs) { if (this == &rhs) return *this; ... return *this; } bool ADT::operator ==(const ADT &rhs) {...} #endif
Canonical Form for a Class Template
file adt.h
#ifndef ADT_H #define ATD_H #include <iostream> using namespace std; template <typename E> class ADT { friend ostream &operator <<<>(ostream &, const ADT<E> &); friend istream &operator >><>(istream &, ADT<E> &); public: ADT(void); ADT(const ADT<E> &); ~ADT(); ADT &operator =(const ADT<E> &) bool operator ==(const ADT<E> &); ... private: ... }; //---------------- Method template definitions template <typename E> ostream &operator <<(ostream &os, const ADT &adt) { ... return os; } template <typename E> istream &operator >>(istream &is, ADT &adt) { ... return is; } template <typename E> ADT<E>::ADT(void) {...} template <typename E> ADT<E>::ADT(const ADT &source) {...} template <typename E> ADT<E>::~ADT() {...} template <typename E> ADT<E> &ADT<E>::operator =(const ADT &rhs) { if (this == &rhs) return *this; ... return *this; } template <typename E> bool ADT<E>::operator ==(const ADT &rhs) {...} #endif