digitalmars.D - Member functions with access to local variables
- Linden Krouse (36/36) Apr 08 2013 Hello! While working on a project of mine, I ran into a situation
- Vladimir Panteleev (17/19) Apr 09 2013 You could use inheritance:
- Linden Krouse (5/24) Apr 09 2013 Ah sorry, it was also kind of a suggestion but mostly a question.
- Linden Krouse (51/51) Apr 09 2013 I suppose my initial example wasn't the greatest. Here's a better
Hello! While working on a project of mine, I ran into a situation where it would be beneficial and elegant to call a function with access to the caller's local variables. Of course D supports this with nested functions but the function to be called needs to have access to the private variables of another object. In fact the function should be a member function of the second class, although then it would need to be passed many (6+) variables, most of which will not be needed in most cases. I know another solution would be sacrificing encapsulation and increase the visibility of the members of the second class but that seems much less elegant. Splitting the function into smaller functions is also not possible as what variables are needed is determined by the second object at runtime. So... Is there a way to have a function be both a nested function and a member function of a different class? Perhaps something like class A { B b = new B(); int foo() { int x = 0; b.bar(); return x; //returns 5 } } class B { private int y = 5; void A.foo:bar() { x += y; } } if there isn't already a way to do this.
Apr 08 2013
On Monday, 8 April 2013 at 23:43:45 UTC, Linden Krouse wrote:Is there a way to have a function be both a nested function and a member function of a different class?You could use inheritance: class A { int i; int f() { return i; } } void main() { int j; class B : A { override int f() { return i + j; } } } In the future, consider posting such questions to digitalmars.D.learn.
Apr 09 2013
On Tuesday, 9 April 2013 at 12:22:56 UTC, Vladimir Panteleev wrote:On Monday, 8 April 2013 at 23:43:45 UTC, Linden Krouse wrote:Ah sorry, it was also kind of a suggestion but mostly a question. Also the second class is mostly unrelated to the first and they both inherit from another classes already.Is there a way to have a function be both a nested function and a member function of a different class?You could use inheritance: class A { int i; int f() { return i; } } void main() { int j; class B : A { override int f() { return i + j; } } } In the future, consider posting such questions to digitalmars.D.learn.
Apr 09 2013
I suppose my initial example wasn't the greatest. Here's a better example of what I'm trying to do. module a; class A : SuperA { B b = new B(); C c; D d; //... this() { b.loadInteralStuff("filepathofstufftoload"); } void doStuff() { int var1, var2; char var3; int[] var4; File var5; //read and parse stuff from a file... //found commands that need to be executed, although //this class only knows that they are a set of commands //not what they actually do (and shouldn't) b.executeCammands(commandArray); } } module b; class B : SuperB { SomeComplexDataStructure data; //private helper functions void loadInternalStuff(string filename) { //load a file in a certain way. This implementation //could be subject to change which shouldn't affect A } void executeCammands(byte[] commands) { //execute each command, most of which need to edit //the local variables of doStuff() but should be //implemented in this class //in most cases, the local variables needed could be //similar to any implementation but are different enough //for it to be a major annoyance to pass every possible //variable needed to this function by reference } } It would be convenient to have a way to either specify that a function can be called only by a specific function and have access to it's local variables or overload a function to provide a specific implementation for certain functions.
Apr 09 2013