Thread overview
invariant
Aug 20, 2002
Carlos
Aug 21, 2002
Walter
Aug 21, 2002
Carlos
August 20, 2002
This should raise an exception, right?

class A {
  int a;
  invariant {
    assert(a>0);
  }
}

void main()
{
  A b;
  b=new A();
  b.a=-2;
}

Besides, if I declare a as private, it still works. Why?


August 21, 2002
"Carlos" <carlos8294@msn.com> wrote in message news:aju78e$1r1o$1@digitaldaemon.com...
> This should raise an exception, right?

No, the invariant only gets called when a public member function gets
called, and after the constructor gets called. There is no constructor
declared for A. If you do declare one like:
    this() { }
then the assert will trip.

> class A {
>   int a;
>   invariant {
>     assert(a>0);
>   }
> }
>
> void main()
> {
>   A b;
>   b=new A();
>   b.a=-2;
> }
>
> Besides, if I declare a as private, it still works. Why?

Because main() is in the same module as class A, so they are 'friends'. If A is put into a separate module, then you'll get the access violation.


August 21, 2002
Ok. Thanks.

"Walter" <walter@digitalmars.com> escribió en el mensaje news:ajv52t$2prk$1@digitaldaemon.com...
>
> "Carlos" <carlos8294@msn.com> wrote in message news:aju78e$1r1o$1@digitaldaemon.com...
> > This should raise an exception, right?
>
> No, the invariant only gets called when a public member function gets
> called, and after the constructor gets called. There is no constructor
> declared for A. If you do declare one like:
>     this() { }
> then the assert will trip.
>
> > class A {
> >   int a;
> >   invariant {
> >     assert(a>0);
> >   }
> > }
> >
> > void main()
> > {
> >   A b;
> >   b=new A();
> >   b.a=-2;
> > }
> >
> > Besides, if I declare a as private, it still works. Why?
>
> Because main() is in the same module as class A, so they are 'friends'. If
A
> is put into a separate module, then you'll get the access violation.
>
>