$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Noel Yap (Noel.Yap_at_[hidden])
Date: 2003-04-24 15:57:23
"Justin M. Lewis" wrote:
>
> The point all along is that this gives you the ability to enforce
> explicitness. It gives you the ability to enforce a design principle, to a
> reasonable degree, even if the caller doesn't know what he's doing, or,
> isn't paying attention. Like I said, it falls under the same principle as
> using private data. If we could trust the users of our classes to NOT break
> the rules, there'd be no reason to have an explicit way of enforcing the
> design rules. But, since it's obvious that given the opportunity people
> will violate the design rules, and directly access class data, given the
> opportunity, and not use the given interface, we all make our data private,
> and force people to go through our public interface to modify the state of
> our objects.
So then what's wrong with:
void f( T const& obj_ ); // f will not change obj_
void f( T& obj_ ); // f may change obj_
> Well, the same thing goes here. We have a design principle that people will
> violate on the caller side. People won't comment the code properly, or mark
> the function to show that the parameters are changing. So, here's a way to
> force them to.
Can you explain the difference between:
f( const_cast< T const& >( _obj ) );
and
f( in_out( _obj ) );
> And, as for making const variables in the function isn't a very effective
> way of handling this problem. I may not want the data to be constant, I may
> want to modify it all over the place, I may pass it to all kinds of
> functions that take const references, but, that doesn't mean I want it const
> throughout my function. So, the only way to make that method work would be
> to do something like:
> int x;
> const int &x_const = x;
>
> and keep 2 instances of each variable around that DOESN'T change, which
> would certainly become a maintenance nightmare. Since, I think it's
> probably the norm that functions NOT modify their parameters.
See above.
> With the wrapper classes I proposed, you only need to mark the parameters
> that DO change, which would be the rare case, rather than the common case,
> which is what you propose marking.
And what would happen if someone doesn't use this nifty new class?
In fact, it sounds like you don't even need a class:
#define in_out( obj ) obj
Noel
-- NOTICE: If received in error, please destroy and notify sender. Sender does not waive confidentiality or privilege, and use is prohibited.