www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Class-Inheritancing Error

reply David T. Oxygen <TKC847567 outlook.com> writes:
I wrote a piece of code like this:

```d
class Person{
	string name;
	this(string name){this.name=name;}
}
class Someone:Person{
	alias super this;
}
void main(){
	Someone x=new Someone("Bob");
}
```
And then,I got a Error-Message:
```
ab.d(6): Error: variable name expected after type `super`, not 
`this`
     alias super this;
                 ^
ab.d(6):        `this` is a keyword, perhaps append `_` to make 
it an identifier

```
Who knows why I can't use `alias this` there? Please tell 
me,thanks very much. I'm waiting for you.
Jul 27
parent reply "H. S. Teoh" <hsteoh qfbox.info> writes:
On Sun, Jul 27, 2025 at 11:08:33AM +0000, David T. Oxygen via
Digitalmars-d-learn wrote:
 I wrote a piece of code like this:
 
 ```d
 class Person{
 	string name;
 	this(string name){this.name=name;}
 }
 class Someone:Person{
 	alias super this;
 }
 void main(){
 	Someone x=new Someone("Bob");
 }
 ```
 And then,I got a Error-Message:
 ```
 ab.d(6): Error: variable name expected after type `super`, not `this`
     alias super this;
                 ^
 ab.d(6):        `this` is a keyword, perhaps append `_` to make it an
 identifier
 
 ```
 Who knows why I can't use `alias this` there? Please tell me,thanks
 very much. I'm waiting for you.
Can you explain more why do you want to alias super to this? A derived class already inherits its base class's members, there's no need to explicitly alias it. T -- Fact is stranger than fiction.
Jul 27
parent reply user1234 <user1234 12.de> writes:
On Sunday, 27 July 2025 at 15:14:03 UTC, H. S. Teoh wrote:
 On Sun, Jul 27, 2025 at 11:08:33AM +0000, David T. Oxygen via 
 Digitalmars-d-learn wrote:
 I wrote a piece of code like this:
 
 ```d
 class Person{
 	string name;
 	this(string name){this.name=name;}
 }
 class Someone:Person{
 	alias super this;
 }
 void main(){
 	Someone x=new Someone("Bob");
 }
 ```
 And then,I got a Error-Message:
 ```
 ab.d(6): Error: variable name expected after type `super`, not 
 `this`
     alias super this;
                 ^
 ab.d(6):        `this` is a keyword, perhaps append `_` to 
 make it an
 identifier
 
 ```
 Who knows why I can't use `alias this` there? Please tell 
 me,thanks
 very much. I'm waiting for you.
Can you explain more why do you want to alias super to this? A derived class already inherits its base class's members, there's no need to explicitly alias it. T
Simply because because if OP writes ``` class Person{ string name; this(string name){this.name=name;} } class Someone:Person{ } void main(){ Someone x=new Someone("Bob"); } ``` then he gets rewarded with
 Error: class `Someone` cannot implicitly generate a default 
 constructor when base class `Person` is missing a default 
 constructor
Jul 27
parent reply "H. S. Teoh" <hsteoh qfbox.info> writes:
On Sun, Jul 27, 2025 at 05:02:35PM +0000, user1234 via Digitalmars-d-learn
wrote:
[...]
 Simply because because if OP writes
 
 ```
 class Person{
     string name;
     this(string name){this.name=name;}
 }
 class Someone:Person{
 }
 void main(){
     Someone x=new Someone("Bob");
 }
 ```
 
 then he gets rewarded with
 
 Error: class `Someone` cannot implicitly generate a default constructor
 when base class `Person` is missing a default constructor
Oh I see. So just write a forwarding ctor: ``` class Someone : Person { this(string name) { super(name); } ... } ``` Or use the mixin template I wrote in the other thread to auto-generate forwarding ctors, if you have many subclasses that need forwarding. T -- If you can't deal with your problems, try becoming a school bus driver. Then all your problems will be behind you.
Jul 28
parent David T. Oxygen <TKC847567 outlook.com> writes:
On Monday, 28 July 2025 at 18:02:45 UTC, H. S. Teoh wrote:
 On Sun, Jul 27, 2025 at 05:02:35PM +0000, user1234 via 
 Digitalmars-d-learn wrote: [...]
 Simply because because if OP writes
 
 ```
 class Person{
     string name;
     this(string name){this.name=name;}
 }
 class Someone:Person{
 }
 void main(){
     Someone x=new Someone("Bob");
 }
 ```
 
 then he gets rewarded with
 
 Error: class `Someone` cannot implicitly generate a default 
 constructor when base class `Person` is missing a default 
 constructor
Oh I see. So just write a forwarding ctor: ``` class Someone : Person { this(string name) { super(name); } ... } ``` Or use the mixin template I wrote in the other thread to auto-generate forwarding ctors, if you have many subclasses that need forwarding. T
Thank you very much. As "user1234" said, I just wanted to inheritance the constructor method in the baseclass. I have already tried your way to solve the problem,it could work. But I still want to know why my code could raise an error.And what's your mixin-template? Would you be so kind to show me this template? I would be grateful if you can share it.
Jul 28