Listing 2 Vector with dynamic VES and reference counting
class Vector; class VES // VES class definition { unsigned lng; // Vector Length unsigned refs; // Reference Count double *ves; // VES friend Vector; VES () // Default Constructor { lng = 0; // No VES refs = 0; ves = NULL; } VES (const unsigned ln) // New Vector VES Constructor { lng = ln; // Set length ves = new double [ln]; // Allocate new VES refs = 0; } VES (const VES& v) // Copy Constructor { lng = v.lng; // Set length ves = new double [lng]; // Allocate new VES & copy memcpy (ves, v.ves, lng * sizeof(double)); refs = 0; } ~VES () { if (ves != NULL) delete ves; } // VES Destructor }; class Vector // Vector class definition { VES *x; // Pointer to VES wrapper public: Vector () { x = NULL; } // Default Constructor Vector (const unsigned ln) // New Vector Constructor { x = new VES (ln); } // Create a new VES Vector (const Vector& v) // Copy Constructor { x = v.x; // Copy VES x->refs++; } // Increment reference count ~Vector () // Destructor { x->refs--; // Decrement reference count if (x->refs == 0) delete x; } // If no references, delete double& operator()(const int coordinate) const { // Address elements by coordinate return x->ves[coordinate]; } unsigned length() const { return x->lng; } // Report Vector length Vector& operator = (const Vector&); // Assignment operator Vector operator+ (const Vector&) const; // Addition operator friend Vector unit (const Vector&); // Unitize Vector }; Vector& Vector::operator= (const Vector& v) // Assignment operator { if (ves != v.ves) { // Protect against self-reference if (x != NULL) { // If current VES has no other references, if (--(x->refs) == 0) delete x; } // delete VES x = v.x; } // Copy reference to VES return *this; } Vector Vector::operator+ (const Vector& v) // Vector addition { if (v.x->lng != x->lng) exit(1); // Ensure conformal addition Vector u (x->lng); // Create same size Vector for (int i = 0; i < x->lng; i++) // Carry out addition u.x->ves[i] = x->ves[i] + v.x->ves[i]; return u; } // End of File