Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   nonmember function (http://www.velocityreviews.com/forums/t447434-nonmember-function.html)

 bluekite2000@gmail.com 08-01-2005 07:58 PM

nonmember function

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)?

 Victor Bazarov 08-01-2005 08:09 PM

Re: nonmember function

bluekite2000@gmail.com wrote:
> 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

 benben 08-03-2005 06:58 AM

Re: nonmember function

> 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<>.

>
> 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)?
>

 msalters 08-03-2005 01:41 PM

Re: nonmember function

bluekite2000@gmail.com 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

 All times are GMT. The time now is 02:33 PM.