Initializing const member post-construction?

Steven Schveighoffer schveiguy at yahoo.com
Tue Oct 28 06:18:24 PDT 2008


"Jerry Quinn" wrote
> Hi.  I'm trying to port a C++ program to D as an exercise in exploring D. 
> As I'm doing this, I've run into a bit of confusion with the const system.
>
> I have something like
>
> class A {}
> class B {
>  const A a;
>  void init(A aa) { a = aa; }
> }
>
> This doesn't work, because dmd (2.020) complains that you can't initialize 
> a const member after the constructor.  The catch is that the value of aa 
> is not available at construction time, but only later on.  However, I'd 
> still like to declare that once set, the object referred to by a is const.
>
> The C++ code used a pointer, but it seemed to me like D's references were 
> more capable than C++'s, so I'm trying to use them.
>
> To me it seems like this should still be allowed.  Even though the object 
> referred to by a is const, the reference itself shouldn't need to be. 
> This seems morally equivalent to:
>
> const(A)* a;
>
> which is allowed by dmd.  In both cases I'm trying to tell the compiler 
> that the object referred to by a is const.
>
> Is there a way to do what I'm trying to do?

You can hide a behind a property:

class B {
  private A aPriv;
  void init(A aa)
  {
     aPriv = aa;
  }

  const(A) a() const { return aPriv;}
}

Now, do not use aPriv anywhere else in your code, and you should be all set. 
Use -inline when compiling and you should see no performance penalty.

> What's the reason for not allowing this?

I was unaware you could even set a in the constructor.  I don't think 
there's any general 'set once' type modifier.

-Steve 




More information about the Digitalmars-d-learn mailing list