$30
Homework 12
This is a nice short homework that illustrates a neat trick that can be done by having a lvalue returned
by a function. You need to write 3 lines of code, one of which is “}” and one of which is given in “What
you need to do” below.
Background:
Multidimensional arrays are a problem with C++. We can do things like
double x[j][k][l][m];
but j, k and l need to be constants in most implementations of C++. We can do something like
double* x = new double[j][k][l][m];
and have all of j, k, l, and m not be constants, but now indexing x[p][q][r][s] requires expressions like
(x + p*k*l*m + q*l*m + r*m + s) (1)
Remember, however, that if we have an lvalue on the right had side of an assignment, C++ will convert it
to a rvalue. For example, if we have x = y, where y is a reference to an object, C++ will use the value at
the location specified by y to assign to x. As well, if we have the assignment y = x; with the same x and y
as before, C++ will use the lvalue of y to specify the memory location where the rvalue specified by x will
be stored.
It turns out we can solve the first problem with indexing by using the property of lvalues and rvalues in
the above paragraph, an using operator overloading. The overloaded ( ) operator in C++ can take
variable numbers of arguments, so we can replace x[p][q][r][s] with x(p,q,r,s) and declare an operator( )
as double& operator( )(int p, int q, int r, ints) and return the location found by the subscript expression
in (1) above as the address of the double being accessed, which the reference double& will be.
What you need to do:
In the Matrix class, create an overloaded double& operator( )(int i, int j); for a two dimensional matrix.
The expression for the element returned for an M x N array x is (x + i*N + j). Use it with the included
main.cpp to both retrieve and store values into the function.
Grading points:
3 points for the desired output
7 points for implementing the operator( ) correctly.