struct in class access
Maxim Fomin
maxim at maxim-fomin.ru
Sun Dec 9 00:55:59 PST 2012
On Sunday, 9 December 2012 at 07:39:29 UTC, js.mdnq wrote:
> On Sunday, 9 December 2012 at 07:24:57 UTC, Jonathan M Davis
> wrote:
>> On Sunday, December 09, 2012 07:54:25 js.mdnq wrote:
>>> Why can't a struct inside a class access the members of that
>>> class without a this pointer? It would seem natural to me
>>> that a
>>> nested struct should probably be special in that it is really
>>> just a special container to reduce clutter in the class.
>>
>> Without a this pointer, there are no class members to access,
>> because they
>> have to be associated with a specific instance of the class
>> unless they're
>> static. Non-static, nested structs have access to their
>> enclosing scope, but
>> then you can't create them separate from the enclosing class.
>> However, if you
>> declare a nested class to be static, it has no access to the
>> class' members
>> and is not associated with a specific instance of the class.
>> It's just that
>> it's declared inside the class instead of outside of it.
>>
>> - Jonathan M Davis
>
> NOOOOOOOOO!!!! It does have a this pointer!! If the sub-struct
> is a true sub struct then it is inline inside the memory of the
> class! That is, any member inside a struct can easily be gotten
> from the pointer to the class(object) as one just has to add a
> simple(and static) offset.
That is why nested struct inside a class actually does not have a
context pointer -its fields addresses are calculated as offsets
from class this pointer, not from struct this pointer.
> If the struct is only used inside the class then there should
> be no problem.
Problems comes when nested struct is created inside a function
without creating a class.
> It makes no sense to have a struct inside a class behave
> exactly as that outside as it offers no benefit to do so(or
> maybe it does, but very little). Hence, we can redefine the way
> structs behave inside classes to make them more useful.
Perhaps the situation can be improved.
> In any case, take this example:
>
> class A {
> public:
> string Name;
> struct B { public: int x; alias x this; void func(A _a) {
> writeln(_a.Name, x, y); }}
> B x;
> B y;
> }
>
> ...
>
> A a;
>
> What is the address of A?
Meaning a, it is null.
> What is the address of x inside A? (i.e., the struct inside A?)
x does not exists
> Is it not a simple static offset from the address of A? i.e.,
> knowing the address of a lets us know the address of x. Knowing
> the address of x also lets us know the address of a! (Same goes
> for y)
Yes, it is a CT-known offset which varies from one class to
another. Note, you can insert nested struct into another class.
> This is why a nested struct(using my semantics) contains the
> this pointer! (because it is a simple offset from the this
> pointer which can be computed at compile time)!
That's why nested struct does not have this pointer - it is POD
structure.
http://dpaste.dzfl.pl/76e8ec0a
More information about the Digitalmars-d-learn
mailing list