Create a class "Array" in C++ that allows a user to specify both forms of arrays. Each element in the array will be a floating point value. The class is to maximize the amount of information hiding. Your answer must clearly show the information that will go into the header file "array.h" and into the source code file "array.cpp". The header file must guarantee that multiple copies of the header information must not exist in any source code file.

- Write a constructor for the class that will take one integer parameter and possibly one floating point parameter. The integer parameter will specify the number of elements to be dynamically created for the array. The lower bound subscript will be 0 and the upper bound subscript will be the integer value minus one. If a floating point parameter is given, all elements of the array are to be initialized with this value. If a floating parameter value is not given, all elements of the array are to be initialized to 0.0.
- Write a constructor for the class that will take two integer parameters and possibly one floating point parameter. The first integer parameter will be the lower bound subscript value. The second integer parameter will be the upper bound subscript value. The number of elements to be dynamically created for the array is (upper bound - lower bound + 1). The upper bound must always be greater than or equal to the lower bound. If a floating point parameter is given, all elements of the array are to be initialized with this value. If a floating parameter value is not given, all elements of the array are to be initialized to 0.0. When accessing elements from this form of an array, the given subscript value will need to be translated into the standard C/C++ subscript form. For example, assume the lower bound is -10 and the upper bound is +10. This array would have 21 elements. The subscript -10 would access the 0-th ("zero-th") element of the array. The subscript -5 would access the 5-th ("fifth") element of the array. The subscript 0 would access the 10-th ("tenth") element of the array. The subscript 10 would access the 20-th ("twentieth") element of the array.
- Overload the [ ] operator to access an element in the array. The accessed element must be able to be used on either the left-hand-side or the right-hand-side of an assignment statement. The subscript specified must be in the range from the lower bound to the upper bound. If a proper subscript, give an error message and exit() the program.
- Write a copy constructor and destructor for this class if needed. If they are not needed, explain why not.
- Overload the = and == operators when both the left-hand-side and the right-hand-side are instances of the Array class. Two arrays are equal if they contain the same number of elements and the i-th element of both arrays are the same for all values of i (note: the allowable subscript values may differ between the two arrays).
- Write two inline methods of the class: upper() and lower(). The method upper() is to return the upper bound subscript value, while lower() is to return the lower bound subscript value.
- The class is NOT to have a data member to hold the number of elements in the array, instead write the utility method size(). This method is to return the number of elements that the array can hold and is only be used internally in the class.
- Write the method grow(). This method is to dynamically increase the number of elements that can be stored in the array. If an integer parameter is given, the number of elements is to increase by this amount. The integer parameter must be a value of 1 or larger. If a parameter of zero or less is given, an error message should be given and the array is not to increase. If no integer parameter is given, the number of elements in the array is to double. When grow() is invoked, the upper bound subscript is to be changed the reflect the new elements added to the array. The lower bound subscript is not to be changed. The value in the i-th element prior to grow() being invoke, must be in the i-th element when grow() returns.