Thread overview | |||||
---|---|---|---|---|---|
|
February 18, 2006 Problem with classes | ||||
---|---|---|---|---|
| ||||
I'm having a bit of a problem when trying to do the following. Here's the pseudo-code ************************** int main() { Mobile NPC[2] = new Mobile; NPC[0].GivenName[] = "Some "; NPC[0].FamilyName[] = "Name "; NPC[0].NickName[] = "Random NPC "; NPC[1].GivenName[] = "Medusa "; NPC[1].FamilyName[] = "Gorgon "; NPC[1].NickName[] = "Beheaded Lady"; PC.PrintInfo(); NPC[0].PrintInfo(); NPC[1].PrintInfo(); return 0; } ************************** And here's the output I'd get from it. ************************** Name: Medusa Gorgon Nick: Beheaded Lady Name: Medusa Gorgon Nick: Beheaded Lady ************************** What kind of approach I'd need to use for NPC[0] and NPC[1] to be treated as two separated entities, thus enabling me to create as much class instances as needed at runtime? Thanks in advance. |
February 18, 2006 Re: Problem with classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to Essoje Oliveira de Almeida | "Essoje Oliveira de Almeida" <Essoje_member@pathlink.com> wrote in message news:dt7nqv$2ioi$1@digitaldaemon.com... > I'm having a bit of a problem when trying to do the following. > > Here's the pseudo-code > ************************** > int main() > { > Mobile NPC[2] = new Mobile; > > NPC[0].GivenName[] = "Some "; > NPC[0].FamilyName[] = "Name "; > NPC[0].NickName[] = "Random NPC "; > > NPC[1].GivenName[] = "Medusa "; > NPC[1].FamilyName[] = "Gorgon "; > NPC[1].NickName[] = "Beheaded Lady"; > > PC.PrintInfo(); > NPC[0].PrintInfo(); > NPC[1].PrintInfo(); > return 0; > } > ************************** > > And here's the output I'd get from it. > ************************** > Name: Medusa Gorgon > Nick: Beheaded Lady > > Name: Medusa Gorgon > Nick: Beheaded Lady > ************************** > > What kind of approach I'd need to use for NPC[0] and NPC[1] to be treated > as two > separated entities, thus enabling me to create as much class instances as > needed > at runtime? > > Thanks in advance. > > It took me a second to figure out what's going on here, but it's kind of tricky and has to do with D's array semantics. When you define the array: Mobile NPC[2] = new Mobile; Something interesting happens. NPC is a statically-sized array of length 2 (i.e. a Mobile[2]). When you initialize it to "new Mobile," it assigns _all_ the elements of NPC to the same instance of Mobile. Thus, NPC[0] and NPC[1] both point to the same instance of Mobile. This is a useful feature of D's arrays as it allows you to fill an array with a single value very quickly, but in this case, it's not immediately obvious. Instead, do Mobile[2] NPC; foreach(inout Mobile m; NPC) m = new Mobile; That will create a new instance of Mobile for each element in NPC. Notice the "inout" in the foreach loop; that makes it so you can modify the contents of NPC inside the foreach loop through the variable m. This is equivalent to for(int i = 0; i < NPC.length; i++) NPC[i] = new Mobile; |
February 18, 2006 Re: Problem with classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | In article <dt7r0k$2l0r$1@digitaldaemon.com>, Jarrett Billingsley says... > >It took me a second to figure out what's going on here, but it's kind of tricky and has to do with D's array semantics. > >When you define the array: > >Mobile NPC[2] = new Mobile; > >Something interesting happens. NPC is a statically-sized array of length 2 (i.e. a Mobile[2]). When you initialize it to "new Mobile," it assigns _all_ the elements of NPC to the same instance of Mobile. Thus, NPC[0] and NPC[1] both point to the same instance of Mobile. This is a useful feature of D's arrays as it allows you to fill an array with a single value very quickly, but in this case, it's not immediately obvious. > >Instead, do > >Mobile[2] NPC; >foreach(inout Mobile m; NPC) > m = new Mobile; > >That will create a new instance of Mobile for each element in NPC. Notice the "inout" in the foreach loop; that makes it so you can modify the contents of NPC inside the foreach loop through the variable m. This is equivalent to > >for(int i = 0; i < NPC.length; i++) > NPC[i] = new Mobile; I see. That did clear up things for me, thank you very much. :) |
Copyright © 1999-2021 by the D Language Foundation