class A { private: int num; char* ptr; A (const A& obj); public: A (int n = 5, char* letters = "HELLO"); ~A(); int GetNum () { return num; } char* GetPtr () { return ptr; } }; A::A (int n, char* letters ) { num = n; ptr = new char [num]; for (int i = 0; i < num; ++i) { ptr[i] = letters[i]; } } A::A (const A& obj) { num = obj.num; ptr = new char[num]; for (int i = 0; i < num; ++i) { ptr[i] = obj.ptr[i]; } } A::~A() { delete [] ptr; } class B { private: int num; A** ptr; public: B (int n, int* iarray, char* carray); B (const B& obj); ~B(); }; B::B (int n, int* iarray, char* carray) { num = n; ptr = new A* [num]; int offset = 0; for (int i = 0; i < num; ++i) { ptr[i] = new A (iarray[i], carray + offset); offset += iarray[i]; } } // Copy constructor should copy the objects // being pointed to, not just the pointers. B::B (const B& obj) { int itemp; char* ctemp; num = obj.num; ptr = new A* [num]; for (int i = 0; i < num; ++i) { itemp = obj.ptr[i]->GetNum(); ctemp = obj.ptr[i]->GetPtr(); ptr[i] = new A (itemp, ctemp); } } B::~B() { for (int i = 0; i < num; ++i) { delete [] ptr[i]; } delete [] ptr; }