Re: How to return a reference, when I really need it
BlackLight wrote:
I'm actually developing a tiny C++ library for managing linear algebra
operations, but I have a problem in managing the reference to an
object as return value. This is the method I wrote:
Vector Matrix::operator[] (size_t i) throw() {
if (i >= rows)
throw InvalidMatrixIndexException();
vector<float> row;
for (int j=0; j < cols; j++)
row.push_back(matrix[i][j]);
return Vector(row);
}
where Matrix is a class I wrote for matrices management, and Vector is
another class (fundamentally a wrapping around vector<float> I wrote
for doing cool mathematical tricks, like sums, scalar products, norms
etc.). This is the actual implementation, but I would like to return a
reference to the Vector object, i.e. Vector& Matrix::operator[] (...).
WHY??? 8-O
I need it to do tricks like
Matrix A;
A[0][0] = 1.0;
or something like that, and this is not possible returning the Vector
object as a value. But if I declare a local Vector object and I return
its reference, I've got a problem as returning the reference of a
local variable. Has any of you a solution for this?
Yes, it's called a proxy object. *Instead* of returning a Vector, you
return a RowProxy (a nested class of Matrix), which itself does not
contain data (like your Vector that wraps vector<float>) but keeps the
reference to the matrix with which it's associated and performs the
operations that you need (like indexing). Here is a sample
implementation (not tested):
class Matrix
{
...
class RowProxy
{
Matrix& rmatrix;
size_t row;
friend class Matrix; // so it can create the proxy
// note that the constructor is private
RowProxy(Matrix& rm, size_t r) : rmatrix(rm), row(r) {}
public:
float& operator[](size_t j) {
rmatrix.matrix[row][j];
}
// conversion to 'Vector' (only if you need one)
operator Vector() const {
// this is where you copy your stuff
Vector v;
for (...
return v;
}
};
friend class RowProxy; // so it can access 'matrix' member
RowProxy operator[](size_t row) {
return RowProxy(*this, row);
}
};
Essentially, it's "lazy evaluation" of sorts.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask