• Create Account

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

9 replies to this topic

### #1Mr Awesome  Members

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.

### #2Conner McCloud  Members

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

### #3Roboguy  Members

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.

### #4Sneftel  Senior Moderators

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.

### #5raz0r  Members

Posted 20 March 2006 - 11:36 AM

Quote:
 Original post by RoboguyThe 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 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 :)

### #6Roboguy  Members

Posted 20 March 2006 - 11:37 AM

Quote:
Original post by raz0r
Quote:
 Original post by RoboguyThe 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 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.

### #7Mr Awesome  Members

Posted 20 March 2006 - 12:21 PM

Quote:
 Original post by SneftelA 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.

### #8Sneftel  Senior Moderators

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.

### #9Kaze  Members

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;}};

### #10Conner McCloud  Members

Posted 20 March 2006 - 12:45 PM

Quote:
 Original post by Mr AwesomeWith 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.