Verschillende elementen in 1 lijst gebruiken

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • PaveloW
  • Registratie: September 2005
  • Laatst online: 22-09 16:54
Ik ben momenteel bezig met een taakbalken systeem wat momenteel als volgt is opgebouwd (C++) :
- er bestaan rijen, kolommen en taakbalken.
- Rijen kunnen kolommen en taakbalken 'vasthouden' en kolommen kunnen rijen en taakbalken vasthouden.
- simpel gezegd steekt het op de volgende manier in elkaar:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
base class BasisElement
{
public:
 virtual bool IsTaakBalk()=0;
};

class Rij/Kolom:public BasisElement
{
private:
  BasisElement* elementen;  // Vector met de verschillende elementen.
public:
 bool IsTaakBalk() { return FALSE; }
 int  AantalTaakBalken();
};

class Taakbalk:public BasisElement
{
public:
 bool IsTaakBalk() { return TRUE; }
};


Elke rij/kolom heeft dus een lijst met BasisElementen. Nu hebben 'Rijen/Kolommen' andere functies nodig dan een 'Taakbalk'.
Nu kan ik op basis van de functie IsTaakBalk() bepalen of het een rij/kolom of een taakbalk is. Nu kan ik vervolgens een element uit de lijst op basis hiervan casten naar het juiste type, en de specifice functies aanroepen.
Een ander methode zou zijn om alle functies als virtual voor beide types in de "BasisElement" te stoppen en op basis van de IsTaakBalk() de juiste functies aan kunnen roepen.

Nou is mijn vraag of hier nog betere/mooiere oplossingen voor te vinden zijn?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik vind zowiezo je IsTaakbalk methode een beetje vreemd. Het lijkt me dat je BasisElement helemaal niks van zijn sub-classes hoeft af te weten.

Je kan eventueel ook met een dynamic_cast controleren of iets een Taakbalk is. Dan heb je daar geen aparte methode voor nodig. Dat is ook wel zo handig, want anders moet je telkens je BasisElement class aan gaan passen als je een andere sub-class krijgt.

Je moet alle eigenschappen die alle BasisElementen gemeenschappelijk hebben in BasisElement zetten. Als Rij/Kolom/Taakbalk ook nog andere eigenschappen hebben die overeen komen, die andere BasisElementen niet hebben, dan zou je eraan kunnen denken om er nog een Class tussen te doen. Je zou dan bijvoorbeeld een Component class kunnen maken die van BasisElement afleid, en dingen zoals Width/Height bevat.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • PaveloW
  • Registratie: September 2005
  • Laatst online: 22-09 16:54
Dank voor je dynamic_cast hint.

Waar ik voornamelijk op doelde is bijvoorbeeld het volgende wanneer ik de functie "AantalTaakBalken();" zou willen implementeren (afgezien van waarschijnlijke enkele implentatie fouten):

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int Rij/Kolom::AantalTaakBalken()
{
    int aantal=0;

    for(int cnt=0;cnt<numElementen;cnt++)
    {
        Taakbalk* balk = dynamic_cast<Taakbalk*>(elementen[cnt]);
        
        if(balk==NULL)
        {
            Rij/Kolom* rijKol = dynamic_cast<Rij/Kolom*>(elementen[cnt]);

            assert(rijKol);
            aantal+=rijKol->AantalTaakBalken();
        }
        else
            aantal++;
    }
    return aantal;
}


Dit is een zo'n beetje de geijkte manier om dit soort dingen op te lossen?