C++ reference type

Andrei Khropov andkhropov at nospam_mtu-net.ru
Sat Jun 24 13:39:32 PDT 2006


Tom S wrote:

> David Medlock wrote:
> > Tom S wrote:
> > > David Medlock wrote:
> > > 
> > > > The attribute functions in classes serve this purpose do they not?
> > > > 
> > > > C++:
> > > > int& my_attr();
> > > > 
> > > > D:
> > > > void my_attr( int );
> > > > 
> > > > use, in both cases:
> > > > foo.my_attr = 100;
> > > 
> > > 
> > > Unless you want to be able to say 'foo.my_attr++;'
> > > or 'foo.someStruct.bar = 1;'
> > > 
> > > The latter can be accomplished by making the function return a pointer
> > > to the struct, but then you cant say 'Foo x = my_attr();'
> > > 
> > > 
> > Ok, but what exactly does that buy you?
> > 
> > If you want reference semantics use a class.
> > If you want opPostInc use a struct.
> > 
> > Even without you could just as easily say:
> > 
> > int bar(int r) { return this.someStruct.bar = r; }
> > 
> > if you have several 'bars' perhaps its time to refactor?
> > 
> > Its like saying : I cant ride my car on bike trails, even though I can
> > ride my bike on roads.  Just use the bike.
> 
> Excuse me, but I have no idea what you're talking about. Reference return
> types are useful in many cases. E.g. if you want to implement your own Array
> class. With normal arrays you can say:
> 
> int[] arr1; ... ; arr1[0] += 2;
> 
> but when you define your own array, like:
> 
> Array!(int) arr2; ... ;
> 
> then how do you implement 'arr2[0] += 2;' ?
> 
> You can't, because there are only opIndex and opIndexAssign operators.
> There's no opIndexAddAssign and opIndex*Assign for that purpose :0
> 
> This gets worse, e.g. if you have a
> 
> struct Foo {
>     int bar;
> }
> 
> Foo[] arr3; ... ; arr3[0].bar = 1;
> 
> but when you define
> 
> Array!(Foo) arr4; ... ;
> 
> then to accomplish the 'arr4[0].bar = 1;' functionality, you have to make
> opIndex return a pointer. Yet then you can't say 'Foo x = arr4[0];' because
> there's a type mismatch. You'd have to dereference the pointer.

Yeah, I agree, D constraints in these cases are really irritating.

-- 
AKhropov



More information about the Digitalmars-d mailing list