[C++] Objecten van template klasse opslaan in een list

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • r0_
  • Registratie: Augustus 2006
  • Laatst online: 22-09 11:53
heren/dames,

Ik heb het volgende:

De klasse Address. Dit is een template klasse zodat ik kan aangeven welke type lijst de klasse Address moet bevatten.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#pragma once
#include <string>
#include <list>

template<typename T>
class Address
{
private:
    std::string dKksCode;
    unsigned dAddress;
    std::list<T> dValueList;
public:
    //Constructor
    Address(std::string pInput = " ", unsigned pNameAddress = 0)
        :dKksCode(pInput), dAddress(pNameAddress)
    {}

    //Destructor
    ~Address()
    {}
    
    //Getter for variable type
    T* GetTypeValue()
    {
        T* lVal = 0;
        
        if(dValueList.empty()== false)
            lVal = &dValueList.front();
        return lVal;
    }

    void AddObject(T newObject)
    {
        dValueList.push_front(newObject);
    }
};


Ik kan dus in main dit doen:
C++:
1
2
Address<SinglePointInfo> spi("schakelaar 0", 00000); \\SinglePointInfo is een klasse
Address<DoublePointInfo> dpi("schakelaar 1",67890); \\DoublePointInfo heeft paar andere attributen dan SinglePointInfo

Nu mijn probleem:

Ik heb de klasse Model gemaakt:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include <list>
#include "address.h"

class Model
{
private:
    std::list<Address> AddressList;

public:
    Model(void)
    {}
    ~Model(void)
    {}
    
    void AddItem(Address item)
    {
        AddressList.push_front(item);
    }
};


De bedoeling hier is dat er een lijstje wordt gemaakt van adressen, ongeacht wat voor een type lijst een adres met zich meedraagt.
Echter de compiler is het niet eens met deze code.

Ik krijg (oa) de volgende errors:
code:
1
2
model.h(8) : error C3203: 'Address' : unspecialized class template can't be used as a template argument for template parameter '_Ty', expected a real type
model.h(8) : error C2955: 'Address' : use of class template requires template argument list


Wat ik er uit op maak is dat het type Address wat ik mee geef aan de list niet specifiek genoeg is. Zou het dan zo moeten zijn dat ik meegeef wat voor een type lijstje (SinglePointInfo) er in Address zit? Dit is niet wat ik wil, zoals gezegd moet er een lijst bijgehouden worden van adressen ongeacht wat voor een type lijst ieder adres bevat.

Ik doe dit allemaal voor mijn studie. Dit is onderdeel van mijn stageopdracht maar mijn begeleider heeft helaas geen kaas gegeten van templates. En school heb ik zo 123 ook niet even bij de hand.
Ik hoop dat eventuele antwoorden of duwtjes in de rug niet al te ingewikkeld worden want ik ben nog beginnend programmeur :+

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-09 20:04
Je kunt in een container niet verschillende template types gooien, het zijn immers verschillende typen. ( Je kunt net zo min integers en doubles mengen in een standaard container )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
De standaard oplossing is om voor Address een base class te maken die alle operaties die je uit wilt voeren on afhankelijk maakt van het template type T.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat je natuurlijk wel kunt doen is een base class maken van Address waar die lijst niet in staat, dit is dan geen template. Vervolgens derive je daarvan met een template waar de lijst wel in staat. In je Model kun je vervolgens pointers naar de base class opslaan - die zijn wel allemaal van hetzelfde type.

.edit: :D

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Lijkt erop dat je hier liever gewoon inheritance gebruikt.

zoiets:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Address {
// alle basis functionaliteit
};

template <typename T>
class SpecializedAddress : public Address {
   T m_member;
};

// Address List
std::list<Address*> alist;
alist.push_back(new SpecializedAddress<SinglePointInfo>("xxx", 12345));
alist.push_back(new SpecializedAddress<DoublePointInfo>("yyy", 54321));

Weet niet precies wat je er verder mee wilt... dus misschien moet het anders.

Wat type ik weer langzaam vandaag...

[ Voor 3% gewijzigd door Zoijar op 03-12-2008 11:15 ]


Acties:
  • 0 Henk 'm!

  • r0_
  • Registratie: Augustus 2006
  • Laatst online: 22-09 11:53
Okee, dat valt dan tegen. Ik beredeneerde meer zo van dat het altijd objecten zijn van het type address, alleen heeft ieder adres een ander attribuut. Maar ik moet het dus zien als een object van een geheel ander type.

De gegeven oplossingen van PrisonerOfPain en .oisyn lijken erg op elkaar in mijn optiek. PrisinerOfPain suggereerd om een base klasse te maken voor Address en .oisyn suggereerd om van Address een base klasse te maken. Ik ga hier mee aan de slag. Misschien kunnen jullie nog even toelichten of jullie ideeen in de basis gelijk zijn of dat er een toch wat andere gedachtegang achter zit?

@Zoijar
De kwestie om gebruik te maken van inheritence of templates heb ik inderdaad gehad. Omdat ik beginnend programmeur ben was het voor mij moeilijk beslissen omdat ik met beide technieken nog niet heel ver vooruit kan kijken. Daarbij was mijn opzet met templates al redelijk gevorderd. Daarom het pad van de templates gekozen. Wel lijkt jouw suggestie toepasbaar te zijn. Ik ga eerst kijken of ik het toch met templates kan fixxen. Zo niet, dan neem ik jouw oplossing nog eens onder de loep!

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
r0_ schreef op woensdag 03 december 2008 @ 11:32:
Misschien kunnen jullie nog even toelichten of jullie ideeen in de basis gelijk zijn of dat er een toch wat andere gedachtegang achter zit?
Het enige verschil is hoe je de base class gaat noemen. Ik had 'm BasicAddress genoemd (oid) en .oisyn had 'm waarschijnlijk hetzelfde gedaan als Zoijar.
Ik ga eerst kijken of ik het toch met templates kan fixxen. Zo niet, dan neem ik jouw oplossing nog eens onder de loep!
Je kunt ook een base class maken voor SinglePointInfo en DoublePointInfo die je door middel van composition mee geeft aan je Address class zodat die geen template parameter meer nodig heeft. Ligt een beetje aan de situatie waar je mee zit :-)

Acties:
  • 0 Henk 'm!

  • r0_
  • Registratie: Augustus 2006
  • Laatst online: 22-09 11:53
Het is opgelost! Een base klasse maken voor Address bracht de oplossing.
Bedankt voor jullie hulp!

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
PrisonerOfPain schreef op woensdag 03 december 2008 @ 12:08:
Je kunt ook een base class maken voor SinglePointInfo en DoublePointInfo die je door middel van composition mee geeft aan je Address class zodat die geen template parameter meer nodig heeft. Ligt een beetje aan de situatie waar je mee zit :-)
Dit is waarschijnlijk de mooiere oplossing. Hierdoor hoef je geen pointers meer in de lijst van Address'en op te nemen, maar kun je die objecten zelf opnemen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1