nonmember function

B

bluekite2000

I d rather have a Matlab syntax such as:

// create a Matrix of size 3,4 and fills it w/ random values.
Matrix<double> M=rand(3,4)

But since this function changes the state of the object, I ought to
make it a member function.

ie.

Matrix<double> M(3,4);
M.rand();

which I dont really like too much.

What is my best option (while maintaining a matlab-like notation)?
 
V

Victor Bazarov

I d rather have a Matlab syntax such as:

// create a Matrix of size 3,4 and fills it w/ random values.
Matrix<double> M=rand(3,4)

But since this function changes the state of the object, I ought to
make it a member function.

ie.

Matrix<double> M(3,4);
M.rand();

which I dont really like too much.

What is my best option (while maintaining a matlab-like notation)?

Add a static function to your 'Matrix' class template and let it create
another instance of 'Matrix'. It's called "a factory method":

template<class T> class Matrix {
...
public:
static Matrix rand(int n, int m) {
Matrix temp(n, m);
... // randomize them
return temp;
}
};

Matrix<double> M = Matrix<double>::rand(3, 4);

You could of course simply have a non-member function, but it would need
to be a template:

template<class T> Matrix<T> rand_matrix(int n, int m) {
...
}

and then you call it:

Matrix<double> M = rand_matrix<double>(3, 4);

V
 
B

benben

I d rather have a Matlab syntax such as:
// create a Matrix of size 3,4 and fills it w/ random values.
Matrix<double> M=rand(3,4)

But since this function changes the state of the object, I ought to
make it a member function.

Not really. If rand() can alter the object state via public interface then
it should be a non-member function, if not, you can still consider making
rand() a friend of Matrix said:
ie.

Matrix<double> M(3,4);
M.rand();

which I dont really like too much.

Neither do I.
What is my best option (while maintaining a matlab-like notation)?

Answered above.
 
M

msalters

(e-mail address removed) schreef:
I d rather have a Matlab syntax such as:

// create a Matrix of size 3,4 and fills it w/ random values.
Matrix<double> M=rand(3,4)

But since this function changes the state of the object

No, it doesn't. If you want to "change the state of an object"
there must be an object state before and after". In this case,
there is no Matrix before. Therefore, rand() doesn't change it.
The syntax you have is quite good. However since rand() is a
quitegeneric name, I'd prefer a static Matrix<double>::rand().
That makes it quite clear:

Matrix<double> M = Matrix<double>::rand(3,4);

HTH,
Michiel Salters
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top