Listing 3 Vector and TempVector with dynamic VES
class TempVector; class Vector // Vector class definition { unsigned lng; // Vector Length double *ves; // Vector Element Space public: friend TempVector; Vector () // Default Constructor { lng = 0; // No VES ves = NULL; } Vector (const unsigned ln) // New Vector Constructor { lng = ln; // Set length ves = new double [ln]; } // Create new VES Vector (const Vector& v) // Copy Constructor { lng = v.lng; // Set length ves = new double [lng]; // Create new VES memcpy (ves, v.ves, lng * sizeof(double)); } Vector (TempVector&); // Typecast "Copy" Constructor ~Vector () { if (ves != NULL) delete ves; } // Destructor double& operator()(const int coordinate) const { // Address elements by coordinate return ves[coordinate]; } unsigned length() const { return lng; } // Report Vector length Vector& operator= (const Vector& v); // Assignment operator Vector& operator= (TempVector& v); // Assignement operator TempVector operator+ (const Vector&) const; // Vector Addition TempVector operator+ (const TempVector&) const; // Vector Addition friend TempVector unit (const Vector&); // Unitize Vector }; class TempVector // Temporary Vector class definition { unsigned lng; // Vector Length double *ves; // Vector Element Space friend Vector; TempVector () // Default Constructor { lng = 0; // No VES ves = NULL; } TempVector (const unsigned ln) // New TempVector Constructor { lng = ln; // Set length ves = new double [ln]; } // Allocate new VES TempVector (TempVector& v) // Copy Constructor { lng = v.lng; // Set length ves = v.ves; // Seize VES v.ves = NULL; } unsigned length() const { return lng; } // Report Vector length public: ~TempVector () { if (ves != NULL) delete ves; } // Destructor double& operator()(const int coordinate) const { // Address elements by coordinate return ves[coordinate]; } friend TempVector unit (const Vector&) // Unitize Vector friend TempVector unit (const TempVector&); // Unitize Vector // No assignment operator friend Vector::Vector (TempVector&); TempVector operator+ (const Vector&) const; // Vector Addition TempVector operator+ (const TempVector&) const; // Vector Addition friend TempVector Vector::operator+ (const TempVector&); }; Vector::Vector (TempVector& v) { // Typecast "Copy" Constructor from TempVector to Vector ves = v.ves; // Seize VES v.ves = NULL; lng = v.lng; } // Set Vector length Vector& Vector::operator= (const Vector& v) { // Assignment operator if (ves != v.ves) { // Protect against self-reference if (ves != NULL) delete ves; // Delete VES, if any lng = v.lng; // Set Vector length ves = new double [lng]; // Allocate new VES & copy memcpy (ves, v.ves, lng * sizeof(double)); } return *this; } Vector& Vector::operator= (TempVector& v) { // Assignment operator // No danger of self-reference if (ves != NULL) delete ves; // Delete VES, if any lng = v.lng; // Set Vector length ves = v.ves; // Seize VES v.ves = NULL; return *this; } TempVector Vector::operator+ (const Vector& v) const { // Vector addition if (v.lng != lng) exit(1); // Ensure conformal addition TempVector u (lng); // Create same size Vector for (int i = 0; i < lng; i++) // Carry out addition u.ves[i] = ves[i] + v.ves[i]; return u; } TempVector Vector::operator+ (const TempVector& v) const { // Vector addition if (v.lng != lng) exit(1); // Ensure conformal addition TempVector u (lng); // Create same size Vector for (int i = 0; i < lng; i++) // Carry out addition u.ves[i] = ves[i] + v.ves[i]; return u; } TempVector TempVector::operator+ (const Vector& v) const { // Vector addition if (v.lng != lng) exit(1); // Ensure conformal addition TempVector u (lng); // Create same size Vector for (int i = 0; i < lng; i++) // Carry out addition u.ves[i] = ves[i] + v.ves[i]; return u; } TempVector TempVector::operator+ (const TempVector& v) const { // Vector addition if (v.lng != lng) exit(1); // Ensure conformal addition TempVector u (lng); // Create same size Vector for (int i = 0; i < lng; i++) // Carry out addition u.ves[i] = ves[i] + v.ves[i]; return u; } // End of File