Category : Files from Magazines
Archive   : CUJ9405.ZIP
Filename : REFCOUNT.CPP

 
Output of file : REFCOUNT.CPP contained in archive : CUJ9405.ZIP


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; }