digitalmars.D.learn - How do i depend on struct composition
- "Mariusz `shd` =?UTF-8?B?R2xpd2nFhHNraSI=?= <alienballance gmail.com> (35/35) Aug 22 2013 Let me try to illustrate my question by following pseudo-code:
Let me try to illustrate my question by following pseudo-code: struct InnerA { /* .. */ void* ptr; } struct InnerB { /* .. */ void* ptr; } struct InnerC { void operate() { auto ptr = this-(void*).sizeof; /* do something with pointer */ } } struct Compound(Inner) { Inner a_or_b; InnerC c; } I need to pass "c" to some subsystem which shouldn't be aware of "a_or_b" However, subsystem should be able to call function InnerB.operate() which needs access to "a_or_b". Now my questions: * Is there any way to tell subsystem, that he can't instantiate nor move InnerC * Is there any better,platform-independent way of accessing pointer from struct a_or_b ? Thanks in advance, Mariusz
Aug 22 2013
On Thursday, 22 August 2013 at 21:07:27 UTC, Mariusz `shd` Gliwiński wrote:Let me try to illustrate my question by following pseudo-code: struct InnerA { /* .. */ void* ptr; } struct InnerB { /* .. */ void* ptr; } struct InnerC { void operate() { auto ptr = this-(void*).sizeof; /* do something with pointer */ } } struct Compound(Inner) { Inner a_or_b; InnerC c; } I need to pass "c" to some subsystem which shouldn't be aware of "a_or_b" However, subsystem should be able to call function InnerB.operate() which needs access to "a_or_b". Now my questions: * Is there any way to tell subsystem, that he can't instantiate nor move InnerC * Is there any better,platform-independent way of accessing pointer from struct a_or_b ? Thanks in advance, MariuszIf you actually nest InnerC inside Compound then it will contain a pointer(using this) to the parent. You can then use `parent` inside `operator` to access the parent which can access a_or_b. if you need to return a member from a_or_b without going through a_or_b then just wrap it. I'm not sure exactly what you are trying to do but I think it can easily be done with standard techniques.
Aug 22 2013
On Thursday, 22 August 2013 at 22:32:53 UTC, JS wrote:On Thursday, 22 August 2013 at 21:07:27 UTC, Mariusz `shd` Gliwiński wrote:[...][...]struct InnerC { void operate() { auto ptr = this-(void*).sizeof; /* do something with pointer */ } } struct Compound(Inner) { Inner a_or_b; InnerC c; }If you actually nest InnerC inside Compound then it will contain a pointer(using this) to the parent. You can then use `parent` inside `operator` to access the parent which can access a_or_b.I think you're thinking of nested classes[1] here. Nested structs[2] are a little different. A nested struct is associated with a function, not with another struct. (By the way, I guess you mean `outer` instead of `parent`.) [1] http://dlang.org/class.html#nested [2] http://dlang.org/struct.html#nested
Aug 22 2013
On Thursday, 22 August 2013 at 23:10:40 UTC, anonymous wrote:On Thursday, 22 August 2013 at 22:32:53 UTC, JS wrote:Your right, I don't know why there isn't an equivalent for structs. In any case, check out http://dpaste.dzfl.pl/7f086694 and http://www.digitalmars.com/d/archives/digitalmars/D/Nested_Structs_183295.html for a solutionOn Thursday, 22 August 2013 at 21:07:27 UTC, Mariusz `shd` Gliwiński wrote:[...][...]struct InnerC { void operate() { auto ptr = this-(void*).sizeof; /* do something with pointer */ } } struct Compound(Inner) { Inner a_or_b; InnerC c; }If you actually nest InnerC inside Compound then it will contain a pointer(using this) to the parent. You can then use `parent` inside `operator` to access the parent which can access a_or_b.I think you're thinking of nested classes[1] here. Nested structs[2] are a little different. A nested struct is associated with a function, not with another struct. (By the way, I guess you mean `outer` instead of `parent`.) [1] http://dlang.org/class.html#nested [2] http://dlang.org/struct.html#nested
Aug 22 2013