Toon posts:

[c++] Inheritance vraagje

Pagina: 1
Acties:

Verwijderd

Topicstarter
Een vraagje na mijn vorige topic [rml][ c++] Inheritance[/rml]

Ik heb dus een map met werknemers. Met daarin oppassers, administrateurs en managers. Nu is er een functie 'voegWerknemerToe()' in manager. En die heeft alleen manager omdat alleen bij hem mensen onder hem kunnen worden geplaatst. Maar nu het volgende. Ik loop de map van werknemers door totdat ik het unieke werknemersnummer van de manager heb. Vervolgens roep ik daar dus de functie in aan 'voegWerknemerToe()' en geef daar het object werknemer mee die bij hem geplaatst moet worden. Nu moet die functie ook aan de class werknemer worden toegevoegd als virtual. Maar dus ook bij oppasser en administrateur...en dat moet dus eigenlijk niet omdat ze gewoon geen werknemers onder zich hebben en ze dus niet bijhouden.

Hoe kan ik dit oplossen?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Niet zoals jij stelt. Wat je moet doen is niet de Werknemer interface misbruiken, maar als je zeker weet dat je Werknemer een Manager is, dan mag je'm daar naar toe casten
C++:
1
dynamic_cast<Manager&>(*pWerknemer).voegWerknemerToe()

[ Voor 12% gewijzigd door curry684 op 29-10-2003 12:55 . Reden: syntaxfouten gefixed, foei meneer Salters :) ]

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


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Als je die methodes niet in je interface wilt plaatsen omdat hij dan te ruim wordt, moet je je gaan afvragen of dat de classes die de methode wel moeten hebben wel direct die interface moeten extenden.
Waarom dan geen interface maken die wel de methode bevat en verder alles wat je basisinterface bevatte?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Je datamodel klopt voor geen meter. Het feit dat een werkgever toevallig werknemers kan toevoegen is voor hem belangrijk, maar niet voor andere werknemers.

Allereerst haal je pure virtual en virtual door elkaar, je kunt dit al semi-netjes afvangen door in werknemer de method zo te introduceren:
C++:
1
2
3
4
virtual void voegWerknemerToe(Werknemer* Pietje) 
{ 
throw DezeWerknemerKanGeenWerknemersOnderZichKrijgen;
}

Op deze manier hoef je de functie in class AdministrieMiep niet te implementeren, want de error blijft hetzelfde. Bij Manager kun je wel de goede implementatie geven. Technisch correcter is echter om het op een hoger niveau af te vangen, dus om de functie alleen in Manager te introduceren. Netst is dan om een aparte lijst van Managers bij te houden naast een algemene lijst van Werknemers, maar je kun het ook als volgt doen met RTTI:
C++:
1
2
3
4
5
6
7
8
9
10
11
Manager* VindManager(int Personeelsnummer)
{
for(int i = 0; i != WerknemerCount; i++)
  if(Werknemers[i]->Personeelsnummer == Personeelsnummer)
    {
    if(dynamic_cast<Manager*>(Werknemers[i]))
      return (Manager*)Werknemers[i];
    throw IsGeenManager;
    }
throw NummerBestaatNiet;
}

Professionele website nodig?