const system in OO code
Alex Burton
alexibu at mac.com
Wed Jun 27 06:15:41 PDT 2007
I am struggling to understand this new const system. I've read the documentation and article about const, but I don't have windows, so I've been unable to test D 2.0.
It looks like great strides have been made to improve compilation which is great.
I am unsure that it is any better than C++ in OO style code.
In order for const to work, the compiler needs to be able to tell whether objects are part of a class or just other objects referenced by a class.
In C++ if an object is part of a class you can go class B { A a; }; or if a pointer is required because A is an interface etc, class B { aggregate_ptr<A> a; }; where aggregate_ptr is a smart pointer with two overloaded -> operators one const returning const and one non const returning non const.
If a method of B is marked const, the compiler can tell if *a is modified, therefore by virtue of a being part of B, that B is modified and the code is invalid.
Alternatively you could go class B { A * a; }; and modify *a as there is no part of relationship expressed.
Moving to D, there is only class B { A a; } where a is a pointer, the compiler and programmer now have no idea whether or not a is part of B.
So there are two options, declare that a cannot be modified in an invariant method of B,
or declare that a can be modified in an invariant method of B.
Both of these options are unsatisfactory IMO.
Please help if I am missing something.
Some example code below :
class A
{
int x;
};
class B
{
this(A a_in)
{
a = a_in;
}
A a; //nothing to say here whether a is logically part of B or is some other object we have a reference to.
int x;
invariant foo()
{
a.x++; //is this an error because invariant is 'transitive' ?
x++; //An error because invariant method cant modify class
}
};
void bar(const B b)
{
b.foo(); //this is an error - const B b means we cannot call invariant methods.
b.x++; //this is an error - const B b means we cannot modify b.
b.a.x++; //is this an error ?
}
int main()
{
B b = new B(new A);
bar(b);
}
More information about the Digitalmars-d
mailing list