Initializing const member post-construction?

Jerry Quinn jlquinn at optonline.net
Tue Oct 28 21:02:27 PDT 2008


Steven Schveighoffer Wrote:

> "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.

Yes, that seems to be a reasonable workaround.  Thanks.

> > 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.

No, I didn't see one either.  In fact what I was asking for is not a set once.  It's to allow a reference to a const object to be reassigned, since it wasn't obvious to me that the reference itself should be kept const.

Jerry



More information about the Digitalmars-d-learn mailing list