Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


C++ Mutators


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
9 replies to this topic

#1 Mr Awesome   Members   -  Reputation: 106

Like
0Likes
Like

Posted 20 March 2006 - 11:22 AM

I'm not sure if I'm using the right word here, but I think a mutator is a method that changes the caller rather than returning a modified copy. In ruby, an exclamation point is the standard way to denote that a method is a mutator. Is there any similar way to do this in C++? Of course I could invent my own way, but I was wondering if there was a standard way to do this or if anyone had a good idea.

Sponsor:

#2 Conner McCloud   Members   -  Reputation: 1135

Like
0Likes
Like

Posted 20 March 2006 - 11:29 AM

You just give it a name that tells you what it does.

struct Whatever
{
void ChangeSomeValue(int i); //This is probably a mutator
int ReturnSomeValue(); //This is probably an accessor
};

CM

#3 Roboguy   Members   -  Reputation: 794

Like
0Likes
Like

Posted 20 March 2006 - 11:29 AM

The term "destructive function" would be more accurate. "Mutator" usually means something else (a method which sets the value of a field to it's argument).

Anyway, I would use references:

#include <iostream>
void f(int& i) {
i = 1;
}

int main() {
int i = 42;
std::cout << i << std::endl; // Prints 1.
return 0;
}


Although, personally, I would avoid modifying arguments where possible.

#4 Sneftel   Senior Moderators   -  Reputation: 1781

Like
0Likes
Like

Posted 20 March 2006 - 11:31 AM

A mutator in C++ is any member function which is not declared as const. There's nothing special about the calling syntax, though.

#5 raz0r   Members   -  Reputation: 586

Like
0Likes
Like

Posted 20 March 2006 - 11:36 AM

Quote:
Original post by Roboguy
The term "destructive function" would be more accurate. "Mutator" usually means something else (a method which sets the value of a field to it's argument).

Anyway, I would use references:

#include <iostream>
void f(int& i) {
i = 1;
}

int main() {
int i = 42;
std::cout << i << std::endl; // Prints 1.
return 0;
}


Although, personally, I would avoid modifying arguments where possible.


You forgot the call :)

#6 Roboguy   Members   -  Reputation: 794

Like
0Likes
Like

Posted 20 March 2006 - 11:37 AM

Quote:
Original post by raz0r
Quote:
Original post by Roboguy
The term "destructive function" would be more accurate. "Mutator" usually means something else (a method which sets the value of a field to it's argument).

Anyway, I would use references:

#include <iostream>
void f(int& i) {
i = 1;
}

int main() {
int i = 42;
std::cout << i << std::endl; // Prints 1.
return 0;
}


Although, personally, I would avoid modifying arguments where possible.


You forgot the call :)


Bah, good point.

#7 Mr Awesome   Members   -  Reputation: 106

Like
0Likes
Like

Posted 20 March 2006 - 12:21 PM

Quote:
Original post by Sneftel
A mutator in C++ is any member function which is not declared as const. There's nothing special about the calling syntax, though.

Right, I'm merely talking about naming conventions here. Also, I'm talking about situations where the intent is ambiguous, not simply getters and setters. Here's an example:


class Vector2D
{
// Does this method normalize the caller and return it
// or return a normalized copy?
Vector2D normalize();
}



With a ton of other methods like this, it would be nice to know which ones change the caller and which do not. Also, you may want one that does and does not, which would require different names to avoid ambiguity. As I said earlier, in ruby, you could name the caller-changing one normalize!() to distinguish, which is very helpful.

#8 Sneftel   Senior Moderators   -  Reputation: 1781

Like
0Likes
Like

Posted 20 March 2006 - 12:26 PM

Well, there's quite a few clues available. First, mutators should always have a name which is an imperative statement. "Normalize!" is an order to the object. The most common convention I've seen is to have "Normalize" be a mutator, and "Normalized" return a normalized version of the unchanged vector. Secondly, as I said, mutators are non-const. On a modern IDE, this will show up when you hover over the method invocation or look in the browse window. Lastly, mutators should, in my opinion, always return void. If there's some side effect information which is produced, it should be returned by reference.

#9 Kaze   Members   -  Reputation: 948

Like
0Likes
Like

Posted 20 March 2006 - 12:33 PM

for existing code all you can really do is check if the name hints at something and if it is a void func(one arg),

for my code i usally just use the java nameing convention, though sometimes only use lowercase so i can type faster


class Point
{
int x,y;
public:

void setX(int X){
x=X;
}
int getX(){
return x;
}
void setY(int Y){
y=Y;
}
int getY(){
return y;
}

};





#10 Conner McCloud   Members   -  Reputation: 1135

Like
0Likes
Like

Posted 20 March 2006 - 12:45 PM

Quote:
Original post by Mr Awesome
With a ton of other methods like this, it would be nice to know which ones change the caller and which do not. Also, you may want one that does and does not, which would require different names to avoid ambiguity. As I said earlier, in ruby, you could name the caller-changing one normalize!() to distinguish, which is very helpful.

Returning a *copy* of the result indicates, to me, that the function returns a normalized vector. Simultaneously changing the original vector is useles, so I would not anticipate this behavior. You only ever need one or the other.

Intelligent names and parameters, const-correctness, and a little common sense will basically tell you everything you need to know.

CM




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS