Jump to page: 1 2
Thread overview
Error: 'this' is only defined in non-static member functions
Nov 22, 2017
Jonathan M Davis
Nov 23, 2017
Jonathan M Davis
Nov 23, 2017
Jacob Carlborg
Nov 23, 2017
Mike Parker
Nov 23, 2017
Jonathan M Davis
November 22, 2017
I have an interface where I have a classes embedded in it's scope (trying to create something for the classes that implement the interface can use for unittesting).

    interface IExample
    {
        // stuff ...
        class Tester
        {

        }
    }

I'm trying to make an instance of it like:

    auto tester = new IExample.Tester();

And I get the above error.
November 22, 2017
On 11/22/17 5:19 PM, A Guy With a Question wrote:
> I have an interface where I have a classes embedded in it's scope (trying to create something for the classes that implement the interface can use for unittesting).
> 
>      interface IExample
>      {
>          // stuff ...
>          class Tester
>          {
> 
>          }
>      }
> 
> I'm trying to make an instance of it like:
> 
>      auto tester = new IExample.Tester();
> 
> And I get the above error.

Hm... not sure how this works for inner classes of Interfaces, but if it's anything like inner classes of classes, then they have a hidden 'outer' pointer pointing at the owning instance of the class.

This allows access to the outer class's members. So you need an instance to instantiate.

I bet it's the same for interfaces.

What you probably want is a static class, which will remove that connection:

static class Tester
...

-Steve
November 22, 2017
On 11/22/17 5:36 PM, Steven Schveighoffer wrote:
> This allows access to the outer class's members. So you need an instance to instantiate.
> 
> I bet it's the same for interfaces.

All that being said, the error message is quite lousy.

-Steve
November 22, 2017
On Wednesday, 22 November 2017 at 22:37:46 UTC, Steven Schveighoffer wrote:
> On 11/22/17 5:36 PM, Steven Schveighoffer wrote:
>> This allows access to the outer class's members. So you need an instance to instantiate.
>> 
>> I bet it's the same for interfaces.
>
> All that being said, the error message is quite lousy.
>
> -Steve

Yup that worked. Thanks!

Out of curiosity, what does static mean in that context? When I think of a static class I think of them in the context of Java or C# where they can't be instantiated and where they are more like namespaces that you can't directly import the contents of.
November 22, 2017
On Wednesday, 22 November 2017 at 22:45:53 UTC, A Guy With a Question wrote:
> On Wednesday, 22 November 2017 at 22:37:46 UTC, Steven Schveighoffer wrote:
>> On 11/22/17 5:36 PM, Steven Schveighoffer wrote:
>>> This allows access to the outer class's members. So you need an instance to instantiate.
>>> 
>>> I bet it's the same for interfaces.
>>
>> All that being said, the error message is quite lousy.
>>
>> -Steve
>
> Yup that worked. Thanks!
>
> Out of curiosity, what does static mean in that context? When I think of a static class I think of them in the context of Java or C# where they can't be instantiated and where they are more like namespaces that you can't directly import the contents of.

Clearly static has a slightly different meaning in D.
November 22, 2017
On Wednesday, November 22, 2017 22:45:53 A Guy With a Question via Digitalmars-d-learn wrote:
> On Wednesday, 22 November 2017 at 22:37:46 UTC, Steven
>
> Schveighoffer wrote:
> > On 11/22/17 5:36 PM, Steven Schveighoffer wrote:
> >> This allows access to the outer class's members. So you need an instance to instantiate.
> >>
> >> I bet it's the same for interfaces.
> >
> > All that being said, the error message is quite lousy.
> >
> > -Steve
>
> Yup that worked. Thanks!
>
> Out of curiosity, what does static mean in that context? When I think of a static class I think of them in the context of Java or C# where they can't be instantiated and where they are more like namespaces that you can't directly import the contents of.

A static, nested class does not have access to the class that it's in. It's basically a normal class that's namespaced within another class, whereas non-static, nested class is associated with a specific instance of the class and has access to that class instance via its outer member.

https://dlang.org/spec/class.html#nested http://ddili.org/ders/d.en/nested.html

Similarly, if a struct, class, or function is nested within a function, and it is not marked with static, then it has access to the function that it's in, whereas if it's marked with static, then it acts more like a normal struct/class/function and does not have access to the function that it's in and is just namespaced within that function.

- Jonathan M Davis

November 23, 2017
> here as non-static, nested class is associated with a specific instance of the class and has access to that class instance via its outer member.
>
> - Jonathan M Davis

Hmmm...now you have me very intrigued. What is a use-case where you'd want to use a non-static embedded class? Sorry if I'm asking too many questions. But there's a lot to dig into with this language.
November 22, 2017
On Thursday, November 23, 2017 00:17:46 A Guy With a Question via Digitalmars-d-learn wrote:
> > here as non-static, nested class is associated with a specific instance of the class and has access to that class instance via its outer member.
> >
> > - Jonathan M Davis
>
> Hmmm...now you have me very intrigued. What is a use-case where you'd want to use a non-static embedded class? Sorry if I'm asking too many questions. But there's a lot to dig into with this language.

It would make sense with something like the nodes of a linked list if they needed access to the container for some reason. Pretty much any case where a an instance of a nested class is going to be associated with a specific instance of its parent class and needs access to it would be a canditate. It's not that uncommon to see cases in C++ or Java where you'd pass a pointer to the "parent" to an instance of a nested class when it's created, and having outer built-in is kind of like that.

Personally, I've never had a use for it. I don't even use classes much in D, since I rarely need inheritance. And as I understand it, most D programs don't use classes very heavily for that very reason. So, I have no idea how common it is to use nested classes in this manner, but I expect that someone has found it useful at some point.

I thought that this meaning of static for nested classes came from Java, but it's been a while since I've done much with Java, so I don't know.

- Jonathan M Davis

November 23, 2017
On Wednesday, 22 November 2017 at 22:45:53 UTC, A Guy With a Question wrote:

> Out of curiosity, what does static mean in that context? When I think of a static class I think of them in the context of Java or C# where they can't be instantiated and where they are more like namespaces that you can't directly import the contents of.

Actually, they work exactly like Java's static nested classes in this context.


class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
}

OuterClass.StaticNestedClass nestedObject =
     new OuterClass.StaticNestedClass();

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
November 22, 2017
On Thursday, November 23, 2017 00:49:33 Mike Parker via Digitalmars-d-learn wrote:
> On Wednesday, 22 November 2017 at 22:45:53 UTC, A Guy With a
>
> Question wrote:
> > Out of curiosity, what does static mean in that context? When I think of a static class I think of them in the context of Java or C# where they can't be instantiated and where they are more like namespaces that you can't directly import the contents of.
>
> Actually, they work exactly like Java's static nested classes in this context.
>
>
> class OuterClass {
>      ...
>      static class StaticNestedClass {
>          ...
>      }
> }
>
> OuterClass.StaticNestedClass nestedObject =
>       new OuterClass.StaticNestedClass();
>
> https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

I thought that that was the case, but my Java is so rusty that I wasn't sure.

- Jonathan M Davis

« First   ‹ Prev
1 2