Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » arrays, unterschiedliche Datentypen und Methodenaufrufe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]
000
30.06.2004, 23:22 Uhr
songbird



Wir haben eine Oberklasse namens Staff.
Manager, Head und Employee sind Unterklassen von Staff. Promanager ist wiederum eine Unterklasse von Employee.

Wir sollen ein Array erstellen, dass 100 Plätze hat und das zu Begin ein Manager, 2 Heads und 10 Employees enthält.
Das Array muss dann also von Typ Staff sein. Der Bezeichner ist persons.

Jede dieser 5 oben genannten Klassen hat eine Methode namens int showMenu(string name). Je nach Mitarbeiter-Status werden dort unterschiedliche Hauptmenüs definiert. Wenn sich also ein Head anmeldet soll ein anderes Menü ausgegeben werden, als wenn sich ein Manager anmeldet. Der Rückgabewert ist dann die jeweilige Menüpunkt-Wahl der Person, die dann in einer switch-case "ausgewertet" wird.

Unser erstes Problem ist jetzt, dass wir ja auf unterschiedliche showMenu()'s zugreifen müssen. Mit persons[pos].showMenu("Hans Meier") wird aber immer in die Klasse Staff verzweigt, da persons ja vom Typ Staff ist. Es müsste aber in die Klasse verzweigt werden, von dessen Typ das Objekt an der Array-Stelle "pos" ist...

Das zweite Problem: die einzelnen Klassen haben unterschiedliche Methoden, die durch die switch-case nach der Menü-Auswahl aufgerufen werden sollen.
Die switch-case steht aber in der Datei run.cpp, die Methoden ja in den jeweiligen cpps zu den zugehörigen Klassen. Wir dachten, dass es zB mit Manager::engageStaff(); geht... Das ist aber nicht der Fall...

Wäre super wenn uns jemand helfen könnte

Dieser Post wurde am 30.06.2004 um 23:22 Uhr von songbird editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.06.2004, 23:24 Uhr
songbird



nochwas zum zweiten Problem:
manager.h ist inkludiert, daher dachten wir dass die Methode engageStaff(), die in manager.h deklariert wird, dann auch bekannt sein müsste... Scheinbar aber nicht

folgende Fehlermeldung bekommen wir beim Aufruf vonManager::engageStaff();:
run.cpp:53: cannot call member function `void Manager::engageStaff()' without object

Dieser Post wurde am 30.06.2004 um 23:29 Uhr von songbird editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.06.2004, 23:31 Uhr
typecast
aka loddab
(Operator)


Was das erste Problem angeht, informier dich mal ber virtuelle Methoden. Damit kannst du das Problem sicher lösen (aufpassen: Du musst um die virtuellen Funktionen anweden zu können Pointer verwenden)

Was das zweite Problem angeht, kann ich da ohne Code und ohne genau Fehlermeldung wenig sagen. Einfach ins blaue geraten wäre mal, dass du die Funktion zwar deklariert aber nicht definiert hast.
Wie du siehst ist da ohne Fehlermeldung und Code wenig zu machen
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.06.2004, 23:34 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
songbird postete
Unser erstes Problem ist jetzt, dass wir ja auf unterschiedliche showMenu()'s zugreifen müssen. Mit persons[pos].showMenu("Hans Meier") wird aber immer in die Klasse Staff verzweigt, da persons ja vom Typ Staff ist. Es müsste aber in die Klasse verzweigt werden, von dessen Typ das Objekt an der Array-Stelle "pos" ist...



Zunächstmal ists ja so, daß wenn Du Dein Array so baust:

C++:
Staff array[...];

array[0] = Manager(...);


also einen Manager in das Array kopierst, dann wird nur ein Staff Objekt im Array gespeichert. Um unterschiedliche Klassen in einem array zu speichern benötigst du ein Pointer array, besser noch einen Vektor:

C++:
std::vector<Staff*> array;
array.push_back(new Manager(...));
array[0]->showMenu();


Natürlich müssen aber alle Methoden auch virtuell sein.


Zitat:
songbird postete
Das zweite Problem: die einzelnen Klassen haben unterschiedliche Methoden, die durch die switch-case nach der Menü-Auswahl aufgerufen werden sollen.
Die switch-case steht aber in der Datei run.cpp, die Methoden ja in den jeweiligen cpps zu den zugehörigen Klassen. Wir dachten, dass es zB mit Manager::engageStaff(); geht... Das ist aber nicht der Fall...


Keine Ahnung. Umschreibe dein Problem anders, dann verstehe ich vielleicht.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.06.2004, 23:39 Uhr
songbird




Zitat:
typecast postete
Was das erste Problem angeht, informier dich mal ber virtuelle Methoden. Damit kannst du das Problem sicher lösen (aufpassen: Du musst um die virtuellen Funktionen anweden zu können Pointer verwenden)

Was das zweite Problem angeht, kann ich da ohne Code und ohne genau Fehlermeldung wenig sagen. Einfach ins blaue geraten wäre mal, dass du die Funktion zwar deklariert aber nicht definiert hast.
Wie du siehst ist da ohne Fehlermeldung und Code wenig zu machen


ok, werden wir mal machen.

in meinem zweiten beitrag hab ich die fehlermeldung zum zweiten problem gepostet..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.06.2004, 23:43 Uhr
dümmerdidümmer



@virtual
öhm muss man das selber wieder freigeben ja oder?

C++:
array.push_back(new Manager(...));

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.06.2004, 23:54 Uhr
virtual
Sexiest Bit alive
(Operator)


@dümmerdidümmer
Ja.

@songbird
Wie gesagt: allein virtuelle Methoden werden dich nicht glücklich machen!
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.07.2004, 00:00 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Wie gesagt: allein virtuelle Methoden werden dich nicht glücklich machen


mich kann virtual alleine glücklich machen, ich liebe auch alle seine Methoden
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.07.2004, 00:18 Uhr
songbird



Hab mich grad mal ein bissl schlau gemacht (in sachen virtual).
da steht hier im forum dieses beispiel mit den säugetieren un da wird das auch mit einem pointer-array gemacht. braucht man da sicher einen vector??

Mit pointern hab ich mich die letzten tage auch mal intensiver befasst und inzwischen machen sie mir nicht mehr ganz soviel angst .

aber dazu hab ich auch nochmal ne frage. welcher code ist richtig(er)?


C++:
Staff * persons[100];
Manager m1(/*attribute*/);
Head h1(/*attribute*/);

persons[0] = m1; //um die stelle gehts
persons[1] = h1; //

persons[0]->showMenu("string");


oder

C++:
Staff * persons[100];
Manager m1(/*attribute*/);
Head h1(/*attribute*/);

*persons[0] = m1; //
*persons[1] = h1; //

persons[0]->showMenu("string");


oder müssten die ersten 3 Zeilen so aussehen:

C++:
Staff * persons[100];
Manager m1 = new Manager(/*attribute*/);
Head h1 = new Head(/*attribute*/);





zum zweiten problem:
das (scheint?) gelöst, wenn die methode void engageStaff() static gesetzt wird.
da man dann auch einen methoden-aufruf ohne objekt machen kann
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.07.2004, 00:24 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

. braucht man da sicher einen vector??


das nicht aber er erleichtert dir die arbeit... vor allen dingen kann dein feld beliebig (soviel der speicher hergibt) gross werden ohne das du dich um irgendwas kümmern musst.
bei deinem beispiel passen ja nur maximal 100 rein.

müssten alle drei beispiel gehen allerdings ist lebenszeit der objekt auf den block in dem du sie definierst beschränkt wenn du sie nicht mit new allokierst...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: