Hiding class pointers -- was it a good idea?
Bill Baxter
dnewsgroup at billbaxter.com
Wed Aug 15 20:17:21 PDT 2007
Jason House wrote:
> Bill Baxter wrote:
>> I'm starting to seriously wonder if it was a good idea to hide the
>> pointers to classes. It seemed kinda neat when I was first using D
>> that I could avoid typing *s all the time. But as time wears on it's
>> starting to seem more like a liability.
>
>
> The simple distinction between reference types and value types has irked
> me from the very beginning. As a programmer using something that
> somebody else wrote, I shouldn't have to know its storage type.
> Distinctions between the two pop up here and there throughout D code.
> For example, value_type[] and ref_type[] have completely different copy
> behaviors.
>
>
>>
>> Bad points:
>> - Harder to tell whether you're dealing with a pointer or not
>> (c.f. the common uninitialized 'MyObject obj;' bug)
>> - To build on the stack, have to use 'scope'
>>
>> Good points:
>> + No need to type '*' everywhere when you use class objects
>> + ??? anything else ???
>
>
> I was thinking recently of an interesting syntax twist... Always
> require & when trying to get to an address, and use the raw variable
> name and "." to refer to whatever is pointed to. Obtaining an address
> would require &.
>
> It's an interesting change, but would likely be too confusing to switch
> over. Somehow I bet even suggesting the idea will mark me as a crack
> pot :)
Well realistically none of this is likely to change anyway, so you're
free to suggest anything you want. :-)
I was thinking about something like that as well, though. But couldn't
really think how to make it useful.
My thinking was that in D we have classes sort of "shifted" by one from
structs
pointer-to-pointer pointer value
struct &(&p) &p p
struct* &p p *p
class &p p N/A
So instead of that make structs default to pointers too, to shift
everything back to be the same:
pointer-to-pointer pointer value
struct# &(&p) &p p
struct &p p *p
class &p p N/A
'#' (or whatever -- perhaps re-use 'scope') becomes the "by value"
indicator. So to do a struct-by-value you'd declare:
MyStruct# Foo;
while
MyStruct Bar;
would be a pointer/reference just like MyClass is.
Some problems are:
- what do you do about built-in value types like 'int'? Doesn't make
sense to make 'int x' be a pointer type, IMHO. And if the built-in
types behave differently from structs have you gained much?
- for structs, as-value should be the common case, so you'll have to use
a '#' most every time you use a struct.
- it still won't make the struct -> class transition all that much
easier unless classes gain the ability to be passed around by value.
--bb
More information about the Digitalmars-d
mailing list