Initializing const member post-construction?
Steven Schveighoffer
schveiguy at yahoo.com
Tue Oct 28 09:40:12 PDT 2008
"Lars Kyllingstad" wrote
> 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.
>>
>>> 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
>
> Isn't that what 'final' is for? I can't seem to find any details on it in
> the D1 specs, but at least that's what it does in Java. I'm not sure it's
> implemented in D1 (yet?), though.
Yes, I believe that is what final is for in D1. But the OP is using D2, and
I believe that context for final was removed (it is now only used on member
functions to mean that the function is no longer virtual).
-Steve
More information about the Digitalmars-d-learn
mailing list