Why `foo.x.saa.aa` and `foo.y.saa.aa` is the same? `shared_AA.saa` should still be instance variable, not class variable, right?
mw
mingwu at gmail.com
Tue Jun 25 03:38:23 UTC 2024
On Tuesday, 25 June 2024 at 02:25:14 UTC, Richard (Rikki) Andrew
Cattermole wrote:
> On 25/06/2024 2:16 PM, mw wrote:
>> struct shared_AA {
>> shared_AA_class saa = new shared_AA_class(); // by this
>> syntax `saa` is still instance variable?
>> alias saa this;
>> }
>
> When you specify an initializer like this, that instance of
> ``shared_AA_class`` gets put into the .init of ``shared_AA``.
>
This is confusing -- well, let's try something similar in C++ and
Java:
```
$ cat shared_aa.cpp
#include <stdio.h>
class shared_AA_class {
public:
int aa;
shared_AA_class() {
printf("new shared_AA_class\n");
}
void print() {
printf("%d\n", aa);
}
};
struct shared_AA {
shared_AA_class* saa = new shared_AA_class(); // by this
syntax `saa` is still instance variable
};
class Foo {
public:
shared_AA x;
shared_AA y;
Foo() {
x.saa->aa = 1; // only modified `x`, not `y`
}
};
int main() {
Foo foo;
foo.x.saa->print();
foo.y.saa->print();
printf("%d\n", foo.x.saa->aa);
printf("%d\n", foo.y.saa->aa);
}
$ g++ shared_aa.cpp
$ ./a.out
new shared_AA_class
new shared_AA_class
1
0
1
0
```
The `shared_AA_class` ctor is called twice, and `foo.x.saa` and
`foo.y.saa` are different object.
```
$ cat Foo.java
class shared_AA_class {
public
int aa;
shared_AA_class() {
System.out.println("new shared_AA_class");
}
void print() {
System.out.println(aa);
}
}
class shared_AA {
shared_AA_class saa = new shared_AA_class(); // by this syntax
`saa` is still instance variable
}
class Foo {
shared_AA x;
shared_AA y;
Foo() {
x = new shared_AA();
y = new shared_AA();
x.saa.aa = 1; // only modified `x`, not `y`
}
public static void main(String[] args) {
Foo foo = new Foo();
foo.x.saa.print();
foo.y.saa.print();
System.out.println(foo.x.saa.aa);
System.out.println(foo.y.saa.aa);
}
}
$ javac Foo.java
$ java Foo
new shared_AA_class
new shared_AA_class
1
0
1
0
```
The `shared_AA_class` ctor is called twice, and `foo.x.saa` and
`foo.y.saa` are different object.
Why D choose to be different here? i.e. `shared_AA_class saa =
new shared_AA_class()` only evaluate only once, and even force it
must be evaluate-able at compile time?
More information about the Digitalmars-d-learn
mailing list