On Tue, Jan 17, 2012 at 08:25:28PM +0100, Timon Gehr wrote: [...] > In other words, non-static nested classes can reference non-static > fields of the enclosing class. [...] [...] > void main() { > auto a = new A; > auto b = a.new B; // construct an 'A.B' with 'a' in implicit > 'outer' field > a.x = 100; > b.echo(); // writes '100' > } > > This is probably one of the more obscure features of D. =) [...]
It totally makes sense though. In some of my past C++ projects, I've had to use the inner class idiom quite often. Of course, it's not directly supported by the language so I ended up writing lots of little nested classes like this: class outer { ... class inner1 { outer *ctxt; ... inner1(outer *c) : ctxt(c) {} }; ... class inner2 { outer *ctxt; ... inner2(outer *c) : ctxt(c) {} }; ... void f() { ... inner1 *helper1 = new inner1(this); register_callback(helper1, ...); ... inner2 *helper2 = new inner2(this); register_callback(helper2, ...); ... } }; After a while, it just got really really tedious to keep writing the same boilerplate code over and over again. In D, a lot of that redundancy can be gotten rid of (no need for explicit outer pointers in the inner classes, eliminate ctor parameters), just because (non-static) inner classes automatically get an outer pointer, and you can just instantiate them with: auto helper1 = this.new inner1; But D lets you do even better. Instead of creating an inner class, you can just pass a delegate to do what needs to be done: void f() { ... register_callback((args) { this.state1++; }, ...); register_callback((args) { this.state2++; }, ...); ... } Much more readable, and much less room for bugs to hide in. T -- "Maybe" is a strange word. When mom or dad says it it means "yes", but when my big brothers say it it means "no"! -- PJ jr.