Here is the owning stack as an ordinary, nonspecialized class:
// Copyright (C)1994 Taligent, Inc. All rights reserved. // $Revision: $ #ifndef Taligent_EXAMPLE1 #define Taligent_EXAMPLE1 class TCollectibleLong; class TOwningStackOf1 { public: TOwningStackOf1(); TOwningStackOf1( const TOwningStackOf1& other ); virtual ~TOwningStackOf1(); // Operator= omitted. It's like the copy constructor. virtual void Adopt( TCollectibleLong* item ); // Orphan omitted. It's like Adopt. virtual unsigned int Count() const; private: TCollectibleLong* fStack[10]; unsigned int fount; }; #endif
// Copyright (C)1994 Taligent, Inc. All rights reserved. // $Revision: $ #ifndef Taligent_EXAMPLE1 #include <Example1.h> #endif #ifndef Taligent_CLASSICDATASTRUCTURES #include <ClassicDataStructures.h> #endif TOwningStackOf1::TOwningStackOf1() : fCount(0) { } TOwningStackOf1::TOwningStackOf1( const TOwningStackOf1& other) : fCount(other.fCount) { for ( unsigned int i = 0; i < fCount; i++ ) { fStack[i] = new TCollectibleLong(*other.fStack[i]); } } TOwningStackOf1::~TOwningStackOf1() { for ( unsigned int i = 0; i < fCount; i++ ) { delete fStack[i]; } } void TOwningStackOf1::Adopt( TCollectibleLong* item ) { fStack[fCount++] = item; } unsigned int TOwningStackOf1::Count() const { return fCount; }
// Copyright (C)1994 Taligent, Inc. All rights reserved. // $Revision: $ #ifndef Taligent_EXAMPLE2 #define Taligent_EXAMPLE2 #ifndef Taligent_PRIMITIVECLASSES #include <PrimitiveClasses.h> #endif template <class AType> class TOwningStackOf2 { public: TOwningStackOf2(); TOwningStackOf2( const TOwningStackOf2<AType>& other ); virtual ~TOwningStackOf2(); virtual void Adopt( AType* item ); virtual unsigned int Count() const; private: AType* fStack[10]; unsigned int fCount; }; #ifndef Taligent_EXAMPLE2TEMPLATEIMPLEMENTATION #include <Example2TemplateImplementation.h> #endif #endif
#ifndef Taligent_EXAMPLE2TEMPLATEIMPLEMENTATION #define Taligent_EXAMPLE2TEMPLATEIMPLEMENTATION #ifndef Taligent_EXAMPLE2 #include <Example2.h> #endif template<class AType> TOwningStackOf2<AType>::TOwningStackOf2() : fCount(0) { } template<class AType> TOwningStackOf2<AType>::TOwningStackOf2( const TOwningStackOf2<AType>& other ) : fCount(other.fCount) { for ( unsigned int i = 0; i < fCount; i++ ) { fStack[i] = new AType(*other.fStack[i]); } } template<class AType> TOwningStackOf2<AType>::~TOwningStackOf2() { for ( unsigned int i = 0; i < fCount; i++ ) { delete fStack[i]; } } template<class AType> void TOwningStackOf2<AType>::Adopt( AType* item ) { fStack[fCount++] = item; } template<class AType> unsigned int TOwningStackOf2<AType>::Count() const { return fCount; } #endif