Instructions
- Design and test a reference array. Reference array stores the references to user supplied objects of different types. Just think it as a heterogeneous array which can contain elements of different types.
- Exceptions must be used to handle all type of errors that may be encountered while using the array. The main errors are:
- No object is found while trying to access an object from the array at a given position
- The index may be beyond the array limits.
- The necessary classes for the problems and also the driver main function are given. You have to provide the implementations of the member functions whose actual code is missing.
// ArrayImp.h
#include
#include
enum SortOrder { Asc, Desc};
class ArrayImp{
protected:
size_t size;
void ** vp;
ArrayImp( size_t sz);
ArrayImp( const ArrayImp& cp);
~ ArrayImp();
ArrayImp& operator=(const ArrayImp & cp);
void * Get( size_t index);
void * Put(size_t index, const void * what);
void Print() const;
};
ArrayImp:: ArrayImp(size_t sz){
if (sz > 0){
size = sz;
vp = new void* [size];
for ( int I = 0; I < size; i++)
vp[i] = 0;
}else{
vp = 0;
size 0;
}
}
ArrayImp:: ArrayImp( const ArrayImp& cp){
if ( cp.size > 0){
size = cp.size;
vp = new void * [size];
for ( int I = 0; i< size; i++)
vp[i] = cp.vp[i];
} else{
size = 0;
vp = 0;
}
}
ArrayImp& ArrayImp ::operator=(const ArrayImp & cp){
// your responsibility
}
void * ArrayImp:: Get( size_t index){
return vp[index];
}
void * ArrayImp:: Put(size_t index, const void * what){
void * oldVal = vp[index];
vp[index] = const_cast (what);
return oldVal;
};
void * ArrayImp:: ArrayImp:: Print() const{
cout<<"Contents:"<
for ( int I = 0; i< size; i++)
cou<
cout<
};
// AExection.h
class ArrayException{
private:
size_t index; // index causing exception
public
ArrayException(size_t pos){ index = pos;}
virtual const char * GetDescription() const = 0;
size_t GetExceptionIndex() const{
return index;
}
};
class NoObjectException: public ArrayException{
public:
NoObjectException( size_t pos): ArrayException(pos){}
const char * GetDescription() const {
return "ERROR: No object at the specified index position";
}
};
class RangeException: public ArrayException{
protected:
size_t size;
public:
RangeException( size_t pos, size_t aSize): ArrayException(pos), size(aSize){}
const char * GetDescription() const {
return "ERROR: Index out of bound";
}
size_t GetArraySize() const { return size;}
}
// SafeArray.h
#include
#include< ArrayImp.h >
#include< AExection.h>
const size_t MAX = 256;
template
class SafeArray: private ArrayImp{
public:
SafeArray ( int sz = MAX);
SafeArray( const SafeArray & cp);
SafeArray & operator=(const SafeArray & cp);
~ SafeArray();
int GetSize(){ return size;}
T& Get(size_t pos) throw (NoObjectException, RangeException);
T& Put(size_t pos, const T & thisObj) throw (RangeException);
T& operator[](size_t index);
void Print() const;
};
// main driver program
#include
#include
#include< ArrayImp.h >
#include< AExection.h>
#include
int main(){
SafeArray x(10), y(10);
int a= 10, b = -100;
x.Put(0,a);
x.Put(1,b);
x.Print();
x[1] = x[0];
y = x;
y.Print();
try{
x[11] = x[3];
}
catch(const NoObjectException & exp){
cout<<"Caught: NoObjectException Exception"<
cout<<"Index Error : " <
};
catch(...){
cout<<"Caught an Exception<
};
cout<<"Trying to access beyond arrya limit"<
try{
x[11] = x[12];
}
catch(const ArrayException& exp){
cout<<
cout<<"Index Error : " <
};
catch(...){
cout<<"Caught an Exception<
};
return 0;
}