"this" reference not working?
Max Samukha
samukha at voliacable.com
Sat Apr 7 06:33:54 PDT 2007
On Sat, 07 Apr 2007 07:34:17 -0400, orgoton <orgoton at mindless.com>
wrote:
>In my program I have these classes
>
>---------------------------------------
>module entity;
>import indexes;
>
>enum EntType : ubyte
>{Pawn, Tower, Queen, Other}
>
>class Entity{
> this()
> {
> index[this.type].add(this);
> }
> ~this()
> {
> index[this.type].remove(this);
> }
> public static const EntType typeEntType.Other;
>}
>-----------------------------------------
>The module indexes keeps track of how many and which objects I have created thus far so
>that I can process them sequentially. In order to increase search speed, I created an
>array of indexes, one for each entity type.
>The index has a .has(Entity target) method that checks if target is indexed.
>
>-----------------------------------
>module pawn;
>import entity;
>
>class Pawn:Entity
>{
> this()
> {
> assert(this.type==EntType.Pawn);
> super();
> assert(index[this.type].has(this), "Pawn not correctly indexed"); //this fails
> }
> ~this()
> {
> //super destructor gets called automagically, no need to remove myself from the index
> }
> public static const EntType type=EntType.Pawn;
>}
>-----------------------------------------
>
>Add some other classes for the remaining EntType entries. Because Entity _may_ be instaciated it must have an index.add and because of overloaded ctors (such as this(coordinates) that I did not copy) the super() is _always_ called and consequently I have entities indexed on the wrong indexes.
>
>On the D documentation, it states:
>"Within a non-static member function, this resolves to a reference to the object for which the function was called."
>The example works fine.
>
>Obviously, this isn't working for ctors. Is this a bug? If not, any suggestions as to I might get my prog working?
You could use a virtual function to solve this:
class Entity{
this()
{
index[this.type].add(this);
}
~this()
{
index[this.type].remove(this);
}
EntType type()
{
return EntType.Other;
}
}
class Pawn:Entity
{
this()
{
assert(this.type==EntType.Pawn);
super();
assert(index[this.type].has(this), "Pawn not correctly
indexed"); //this fails
}
~this()
{
//super destructor gets called automagically, no need
to remove myself from the index
}
override EntType type()
{
return EntType.Pawn;
}
}
-------------------
Or using ClassInfo:
class Entity{
this()
{
index[this.classinfo].add(this);
}
~this()
{
index[this.classinfo].remove(this);
}
}
class Pawn:Entity
{
this()
{
super();
assert(index[this.classinfo].has(this), "Pawn not
correctly indexed"); //this fails
}
~this()
{
//super destructor gets called automagically, no need
to remove myself from the index
}
}
There may be a better solution.
More information about the Digitalmars-d-learn
mailing list