///////////////////////////////////////////////////////////////////// // smartPointer.cpp - demonstrates the basic ideas used with // // smart pointers // // // // Jim Fawcett, CSE687 - Object Oriented Design, Spring 2002 // ///////////////////////////////////////////////////////////////////// #include using namespace std; ///////////////////////////////////////////////////////////////////// // trace display functions // template void trace(const char *msg, T t) { cout << "\n " << msg; if(t) cout << t; } void trace(char underline, const char *msg) { cout << "\n " << msg; cout << "\n " << string(strlen(msg)+2, underline).c_str(); } void trace(const char *msg) { cout << "\n " << msg; } ///////////////////////////////////////////////////////////////////// // definition of smart pointer class // template class smartPointer { public: smartPointer() : _tPtr(0) {} smartPointer(T *tPtr) : _tPtr(tPtr) { } ~smartPointer() { _tPtr = 0; } T& operator*() { return *_tPtr; } T* operator->() { return _tPtr; } private: T *_tPtr; }; // ///////////////////////////////////////////////////////////////////// // a structure type used in a demonstration of smart pointers // struct aStructType { int x; double y; char z; }; //----< entry point >------------------------------------------------ void main() { trace('=', "Demonstration of Basic Smart Pointer Type"); double d; smartPointer sp1(&d); *sp1 = 3.1415927; trace("value of smartly pointed double is: ",*sp1); smartPointer sp2 = &d; trace("using compiler generated copy of pointer, double value is: ",*sp2); aStructType aStruct = { -5, 0.33333, 'z' }; smartPointer sp3(&aStruct); trace("1st field of struct has value: ", sp3->x); trace("2nd field of struct has value: ", sp3->y); trace("3rd field of struct has value: ", sp3->z); trace("\n\n"); }