Re: pass string by value because of "mean what you say"?
On 23 Feb., 19:25, Frank Birbacher <bloodymir.c...@gmx.net> wrote:
struct Foo
{
virtual void setName(std::string const&) =0;
virtual std::string const& getName() const =0;
};
struct SimpleFoo : Foo
{
void setName(std::string const& newName) { name = newName; }
std::string const& getName() const { return name; }
private:
std::string name;
};
struct BrokenFoo : Foo
{
void setName(std::string const& newName) { namePtr = newName; }
std::string const& getName() const { return *namePtr; }
private:
std::string namePtr;
};
I think you meant
void setName(std::string const& newName) { namePtr =
&newName; }
std::string* namePtr;
This will certainly break sooner or later, because someone will pass a
temporary variable to setName. This would be avoided with a signature
like "void setName(std::string newName)" because of pass-by-value.
Wouldn't this follow the saying "say what you mean, mean what you say"
more strictly than a reference argument?
Using pass-by-value for newName is not better than pass-by-reference-
to-const in that respect -- except that the compiler may warn about
storing the address of a local variable in some other place (I'm not
sure if any compiler does this).
I'd keep pass-by-reference-to-const for setName and use *return-by-
value*:
struct GoodFoo : public Foo
{
void setName(std::string const& newName) { name = newName; }
std::string getName() const { return name; }
private:
std::string name;
};
It's reasonable to use pass-by-reference-to-const in setName(). It'll
avoid an unnessecary copy. Using return-by-value has two advantages:
(a) the user can't use a const_cast to mess with your object's
internals and (b) it allows an object to store the name in something
other than a string object.
Cheers!
SG
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]