*final* class member (D2)

Jason House jason.james.house at gmail.com
Wed Feb 13 12:50:39 PST 2008


Robert Fraser Wrote:

> Robert Fraser wrote:
> > Denton Cockburn wrote:
> >> On Wed, 13 Feb 2008 10:59:26 -0500, Denton Cockburn wrote:
> >>
> >>> How do I do this?  I'm trying to create a class member here that 
> >>> needs to
> >>> be initialized in the constructor, but cannot be changed later.
> >>>
> >>> class A
> >>> {
> >>>    (const doesn't work) real delegate() dg; // this is that
> >>>    function;
> >>>
> >>>    this(real delegate() dg) { this.dg = dg; }
> >>> }
> >>>
> >>> class B
> >>> {
> >>>    real foo() { return 3.5; }
> >>> }
> >>>
> >>> class C
> >>> {
> >>>    real foo() { return 4.5; }
> >>> }
> >>>
> >>> void main()
> >>> {
> >>>    auto b = new B;
> >>>    auto a = new A(&b.foo);
> >>>    auto c = new C;
> >>>    a.fitness = &c.foo; // I want this to be an error
> >>> }
> >>
> >> formatting issues:
> >>
> >> (const doesn't work) real delegate() dg; // this is that
> >>    function;
> >>
> >> should be:
> >>
> >> (const doesn't work) real delegate() dg; // this is that function
> >>
> > 
> > Use "final" :-)
> 
> Oops, I thought you meant member function. AFAIK, there's no way to do 
> that for a member variable.

I thought member variables with a const storage class could be initialized in the constructor.  I thought it was possible to do stuff like:
class X{
  const int a;
  this(int b){ a = b; }
}

Am I wrong about that?  If not, why can't this apply to delegates?  Could it be confusion about return type verses const storage class?  If that's the problem, enclosing with const{} could solve the problem...


More information about the Digitalmars-d-learn mailing list