On Friday, 8 March 2024 at 03:19:59 UTC, Richard (Rikki) Andrew Cattermole wrote:

On 08/03/2024 4:09 PM, Liam McGillivray wrote:

Thank you. Is this first example you gave the template? Is the syntax `(ATile : Tile)` saying that ATile must be a derived class of Tile? If this isn't worse in any way than your second example, then I don't know why I wouldn't choose this one.

Typically in D we use templates quite heavily, but what you are wanting is probably more familiar to you via the OOP method with a factory of some kind.
Nope, but thank you. I am not a very experienced programmer. The most complex thing I've ever done previous to this was my work on [Condorcet](https://github.com/julien-boudry/Condorcet) which is in PHP. I might have encountered something about factory methods, but I don't remember. I have some C++ experience, but I haven't been very successful with it. What I have so far in the game I'm making is the most complex program I have ever written.

I suppose that if I do this, then the derived class `Mission` would be declared like `class Mission : Map(GridTile)`, right?

``class Mission : Map!GridTile`` but right idea.

When I tried adding that parameter to the Map class, on attempting to build it it complained that references to Map in other classes were incomplete, as they didn't include a parameter. I suppose I must make my other classes templates too.
I have an update on this, after taking another go at it.

A problem I have is that the 3 classes Map, Tile, and Unit reference each-other. If I turn Map into a template, than it complains about the member variable of Unit declared as `Map map;` without arguments. I change this line to `Map!TileType map;` but this requires that Unit is also turned into a template. After changing `class Unit` to `class Unit (TileType), it complains about the line `Unit* occupant;` in Tile. I try turning Tile into a template with the `TileType` parameter, which means that the class inheriting Tile will need to use itself as a parameter. Surprisingly, I have done this and it hasn't taken issue (so far). But now that I have turned Tile into a template, it complains about the declaration of Map being `class Map (TileType : Tile)`, as `Tile` is no longer a class but a template.

Here are some of the build errors:
```
Starting Performing "debug" build using /usr/bin/dmd for x86_64. Up-to-date bindbc-freetype 1.1.1: target for configuration [staticBC] is up to date. Up-to-date fluid 0.6.3: target for configuration [default] is up to date. Building open_emblem_raylib ~master: building configuration [application] ../source/map.d(185,13): Error: template class `unit.Unit(TileType)` is used as a type without instantiation; to instantiate it use `Unit!(arguments)` ../source/map.d(21,19): Error: template class `unit.Unit(TileType)` is used as a type without instantiation; to instantiate it use `Unit!(arguments)` ../source/map.d(22,27): Error: template class `unit.Unit(TileType)` is used as a type without instantiation; to instantiate it use `Unit!(arguments)` ../source/map.d(125,11): Error: template class `tile.Tile(TileType)` is used as a type without instantiation; to instantiate it use `Tile!(arguments)` ../source/map.d(129,14): Error: template class `tile.Tile(TileType)` is used as a type without instantiation; to instantiate it use `Tile!(arguments)` ../source/map.d(133,11): Error: template class `unit.Unit(TileType)` is used as a type without instantiation; to instantiate it use `Unit!(arguments)` ../source/unit.d(12,12): Error: template instance `map.Map!(VisibleTile)` error instantiating ../source/tile.d(19,9): instantiated from here: `Unit!(VisibleTile)` source/vtile.d(4,21): instantiated from here: `Tile!(VisibleTile)`
```

Will I somehow manage to solve this problem?

Given that it's possible to declare an object inside a class, and then fill it with an object of a derived class, I would have thought it would be possible to use a template as a type, and then fill it with an object of a class derived from that template.
  • Can a D library ... Liam McGillivray via Digitalmars-d-learn
    • Re: Can a D... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
      • Re: Can... Liam McGillivray via Digitalmars-d-learn
        • Re:... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
          • ... Liam McGillivray via Digitalmars-d-learn
            • ... cc via Digitalmars-d-learn
              • ... Liam McGillivray via Digitalmars-d-learn
              • ... Liam McGillivray via Digitalmars-d-learn
                • ... Liam McGillivray via Digitalmars-d-learn
                • ... Liam McGillivray via Digitalmars-d-learn
                • ... cc via Digitalmars-d-learn
      • Re: Can... Liam McGillivray via Digitalmars-d-learn

Reply via email to