template class PtrArray { public: PtrArray(int sz = 0, int do_manage = 1); ~PtrArray(); PtrArray(const PtrArray &); PtrArray &operator=(const PtrArray &); int operator==(const PtrArray &) const; int operator!=(const PtrArray &) const; T *&operator[](int); const T *operator[](int) const; void operator+=(T *); int getsize() const; void grow(int); int find(const T *) const; void clear(int); private: void copy_arr(const PtrArray &); int manage; int size; T **array; }; public interface PtrArrayElement { // All restrictions on array elements come here // If no restrictions are imposed, use Object instead } public interface PtrArrayInterface { int getsize(); void grow(int); int find(PtrArrayElement); void clear(int); private: void copy_arr(PtrArrayInterface); } public abstract class PtrArray implements PtrArrayInterface { public: PtrArray(int sz = 0, int do_manage = true); ~PtrArray(); PtrArray(PtrArray); PtrArray assign(PtrArray); boolean equals(PtrArray); boolean notEquals(PtrArray); PtrArrayElement elementAt(int); private: boolean manage; int size; T array; }