Const again
naryl
cy at ngs.ru
Sun Jan 27 13:53:14 PST 2008
On Sun, 27 Jan 2008 18:17:03 +0300, Jason House
<jason.james.house at gmail.com> wrote:
> naryl wrote:
>
>> Is there a way to make something like this work in D 2.0?
>>
>> clone is supposed to make a new shallow copy of it's object:
>>
>> interface Cloneable
>> {
>> const Cloneable clone();
>> }
>>
>> class Demo : Cloneable
>> {
>> public :
>> this(){}
>>
>> this( Demo reference )
>> {
>> reference_ = reference;
>> }
>>
>> override const Demo clone() {
>> return new Demo( reference_ );
>> }
>> private:
>> Demo reference_;
>> }
>>
>> void main()
>> {
>> auto a = new Demo(new Demo);
>> auto b = a.clone();
>> }
>>
>> The method clone must be const and there must be a non-const constructor
>> in Demo.
>
> It looks like you should change this( Demo reference ) to this( const
> Demo
> reference ). Is that what you were saying is not allowed? If so, can
> you
> explain what's going wrong and why you can't?
Never mind. Shallow clone() cannot be const because reference_ may be
changed through it's copy. The problem was solved by making two versions:
"Demo clone()" and "const Demo deepClone()":
class Demo
{
public :
this(){}
public this(Demo reference) {
reference_ = reference;
}
Demo clone() {
if (reference_ !is null)
return new Demo( reference_ );
else return new Demo();
}
const Demo deepClone() {
if (reference_ !is null)
return new Demo( reference_.deepClone() );
else return new Demo();
}
private:
Demo reference_;
}
More information about the Digitalmars-d-learn
mailing list