From: Noel Yap (Noel.Yap_at_[hidden])
Date: 2003-05-03 19:55:27


"Justin M. Lewis" wrote:
> > If you wrote the function, why did you write it taking in a pointer if
> > the intent is not an in/out parameter?
>
> Maybe you're in a place where you just had to work with pointers. It
> happens.

I still don't understand. Do you intend to rewrite the function
interface?

> > Can you explain or elaborate what you mean by "using pointers", please?
> >
>
> using pointers, it seems pretty self explanatory to me.
> myfunc(const obj *ptr);
>
> If you're not dealing with something where you know you have allocated data
> floating around, you should use a reference.
>
> myfunc(const obj &ptr);

Wouldn't this still be dynamically allocated memory:

  obj* ptr = new obj();
  myfunc( *ptr );

> But, like I said, there are cases where you have to allocate data. So, how
> do you differentiate calls like
>
> myfunc1(const obj *ptr)
>
> from
>
> myfunc2(obj *ptr) ?

By using:
  void myfunc1( boost::dumb_ptr< obj const > ptr );
  void myfunc2( boost::dumb_ptr< obj > ptr );

> I mean, if you just put dumb_ptr in place of both, how is it any different?

Because the type with which dumb_ptr is parameterized is different
thereby creating different types.

> How can you tell one from the other, without looking up the prototype?

Therefore:

  boost::dumb_ptr< obj > in_out;
  boost::dumb_ptr< obj const > in;

  myfunc1( in_out ); // compiler error; if you want to pass in/out
parameters into in slots, there can be a conversion operator
  myfunc2( in ); // compiler error

> I'm just saying, passing by pointer doesn't explicitly tell you anything,
> whereas, c_out and c_in_out do.

IMHO, it does. Like I said, they are just syntactic differences between
the two styles (except for the NULL situation).

Noel