Hiding class pointers -- was it a good idea?

Walter Bright newshound1 at digitalmars.com
Wed Aug 15 17:53:23 PDT 2007


Brad Roberts wrote:
> On Wed, 15 Aug 2007, Walter Bright 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.
>> Having classes be by reference only has some serious advantages:
>>
>> 1) Classes are polymorphic and inheritable. By making them reference only, the
>> "slicing" problem inherent in C++ is completely and cleanly avoided.
>>
>> 2) You can't write a class in C++ without paying attention to assignment
>> overloading and copy constructors. With classes as a reference type, these
>> issues are simply irrelevant.
> 
> They're _less_ relevant.  There's still the valid usecase of acting like a 
> value to avoid instance sharing where copy construction and assignment's 
> are.  This is where it's the author of the class making that decision 
> rather than the user that you talk about in other responses to this 
> thread.

I strongly feel that for that usecase, one should be using a value type, 
i.e. a struct, not a class. C++ classes are neither one nor the other, 
thereby doing neither well.


> That's the distinction between 'by value' vs 'by reference' and 'as a 
> value' vs 'as references'.  IE, access vs behavior.  I like a strong 
> enforcement and distinction between the access part, but I do believe that 
> it should be possible for a class write to achieve value semantics.

I don't agree, I think there is much to be gained by drawing a strong 
distinction. Value and reference types are *fundamentally* different. 
Classes are an OOP type, and giving them value semantics introduces all 
the gotchas C++ has with them (like the slicing problem).

However, it is possible to use a struct to wrap a class reference.


>> 3) Value types just don't work for polymorphic behavior. They must be by
>> reference. There's no way in C++ to ensure that your class instances are used
>> properly by reference only (hence (2)). In fact, in C++, it's *extra work* to
>> use them properly.
>>
>> Value types are fundamentally different from reference types. D gives you the
>> choice.
> 
> 



More information about the Digitalmars-d mailing list