We can all agree on public variables being bad for encapsulation and all that. However, I noticed a lot of code that does this type of stuff:
class foo {
private:
int integer_;
string someString_;
// other variables
public:
int& integer() { return integer_; }
string& someString() { return someString_; }
// other "functions"
}
int main() {
foo f;
f.integer() = 10;
f.someString() = "something";
return 0;
}
I have seen this being used in many places and I don't get why. Basically it returns a reference to the data and thus exposes it directly to the outside. So encapsulation is not really achieved, not from any perspective.
Why is this commonly used?
There's a recurring mantra, that getter/setter functions should be used to encapsulate your data. Hence many (unexperienced or coffee-overloaded) programmers get the idea they should use something like:
int& integer() { return integer_; }
but that isn't much different from simply writing:
class foo {
public: // <<<
int integer_;
string someString_;
// ...
};
Well, it adds a function call, but you cannot control what the client does with the reference.
If you really want to provide a getter function write:
const int& integer() const { return integer_; }
A corresponding setter function looks like:
void integer(const int& value) {
integer_ = value;
}
I have to partially disagree both with @πάνταῥεῖ and @Rakete1111 's answers, considering how a class's definition is something that may evolve over time.
While it's true that, often, these getter methods are written by someone who's just heard the "no exposing members" mantra, they can also have legitimate uses:
vector<bool>
works; when you call its operator[]
you don't get a boolean&
, you get some kind of proxy which, when assigned or assigned-to, does the appropriate bit extraction or setting.To sum up: The "dummy" non-const-reference getter can be a stub for other, meaningful, code.
That being said, it is often a good idea to just make the getter return a const reference or a value. Or just exposing the field in those cases where it's appropriate (and there are some of those too).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With