-wrax-
<...>
|
also ich hätte da ein problem mit c++ (tuboc)...
kann ich auf der ersten stelle eines pointerarrays der basisklasse folgendes machen: ... ich will die variablen der basisklasse, und der abgeleitenden klassen, alle in eine stelle des pointer-arrays geben.... (so das ich sie später auch wieder abrufen kann)....
freu mich schon auf eure antworten.... (vielleicht auch mit code)
|
that
Hoffnungsloser Optimist
|
was hast du vor?
|
-wrax-
<...>
|
zb.: class oben { public:.... protected: int alter; char name[20]; } class unten: public oben { public: .... protected: int anzahl; char postition[20]; } void main() { .... oben *o[5] //und jetzt will ich auf o[0] "alter","name","anzahl",postition speichern ... } bitte antwortets nur wenns programmieren koennts...
Bearbeitet von -wrax- am 25.05.2002, 19:13
|
that
Hoffnungsloser Optimist
|
das wird so nicht funktionieren, weil es die Member "anzahl" und "postition" (?) nur in der Klasse "unten" gibt...
|
-wrax-
<...>
|
EBEN...
diese erkenntnis habe ich auch schon gmacht...
aber bei einer collection (sammlung) macht man immer eine instanz von der basisklasse in die dann alles andere irgendwie hinein gegwetscht wird....
wennst du eine andere moeglichkeit hast, mit nur einen array alle memberdaten anzusprechen dann sag es mir..
(ansprechen kann ich ja, einfach mit casten,,, aber danach wieder aufrufen, funktioniert nicht)
|
that
Hoffnungsloser Optimist
|
naja, was schon geht ist folgendes:
oben *a[5]; a[0] = new unten("bla", 20, "blubb", 100); printf("Name: %s, Anzahl: %d\n", a[0]->GetName(), ((unten*) a[0])->GetAnzahl()); delete a[0];
(falls die erforderlichen Methoden und der Constructor für "unten" entsprechend implementiert sind)
|
-wrax-
<...>
|
das mit dem casten ist so eine sache... zb.: class oben { public:obenEingabe(); private:char name[20]; int alter; }; class unten ben { public:unten (const oben &o): oben(o) {} untenEingabe(); private:int anzahl; char typ[20]; } void main() { .... oben *a[5]; a[0]=new unten; a[0]->untenEingabe(); (oben (*a[0])).obenEingabe(); // UND GENAU AB HIER KANN ICH DAS VERGESSEN // WAS ICH GERAD BEI "untenEingabe" eingegeben habe... // das heißt === das ich es dann spaeter nicht mehr abrufen kann
a[0]->untenAusgabe(); //hier steht was totall unkenntliches jetzt (oben (*a[0])).obenAusgabe(); // hier steht jedoch das richtige drinnen was ich gerade oben beim casten eingegeben habe...... } das bedeutet das er beim casten, das ganze feld loescht und nur noch sein gecastedes merkt...
Bearbeitet von -wrax- am 25.05.2002, 21:37
|
that
Hoffnungsloser Optimist
|
Dein Code kann so gar nicht funktionieren, weil u.a. die Casts an der falschen Stelle sind. Poste mal echten, compilierfähigen Code, dann kann ich dir besser sagen warum er nicht das tut was du willst.
|
-wrax-
<...>
|
nja.. wennst du dir das an tuen willst....
/*************************************** ************** Klasse: ***************** **************************************** *************** SPORTG ***************** ***************************************/
class sportg {
/* Public */ public: /*** KONSTRUKTOR ***/ sportg() {} /* Initalisierungsliste */ //sportg(int p=0, int g=0, char h[]): preis(p), // garantie(g) {h[0]='\0'; strcpy(h,hersteller); }
/*** Methoden ***/ virtual void fahren (); virtual void trick();
virtual void wifuspEingabe(); virtual void wifuspAusgabe();
void reparieren(); void sportgEingabe(); void sportgAusgabe();
/* Protected */ protected: /*** ATTRIBUTE ***/ int preis; int garantie; //wie lange garantie anhaelt.. zb. 2jahre char hersteller[]; };
/*************************************** ************** Klasse: ***************** **************************************** *************** WIFUSP ***************** ***************************************/
class wifusp: public sportg { public: wifusp(const sportg &s): sportg(s) {} wifusp() {} /*wifusp(unsigned s=30, unsigned l=100): schuhg(s), laenge(l) {}*/
void fahren(); void trick();
void wifuspEingabe(); void wifuspAusgabe(); void bindungAuf(); void bindungZu();
protected:
int schuhg; int laenge; char bindung[]; };
void sportg::sportgEingabe() { cout<<"\n\n\n\n"; cout<<"\n Preis: "; cin>>preis; cout<<"\n Garantie: "; cin>>garantie; cout<<"\n Hersteller: "; cin>>hersteller; } void sportg::sportgAusgabe() { cout<<"\n\n\n\n"; cout<<"\n Preis: "<<preis; cout<<"\n Garantie: "<<garantie; cout<<"\n Hersteller: "<<hersteller; }
void wifusp::wifuspEingabe () { cout<<"\n\n\n\n"; cout<<"\n L„nge: "; cin>>laenge; cout<<"\n Schuhgroesse: "; cin>>schuhg; cout<<"\n Bindungstyp: "; cin>>bindung; }
void wifusp::wifuspAusgabe () { cout<<"\n\n\n\n"; cout<<"\n Die eingegebene L„nge lautet: "<<laenge; cout<<"\n Die eingegebene Schuhg lautet: "<<schuhg; cout<<"\n Die eingegebene Bindung ist: "<<bindung; }
Und jetzt schreib mir die Hauptfunktion fuer die eingabe und die asugabe auf einer stelle eines pointerarrays....
Bearbeitet von -wrax- am 25.05.2002, 22:27
|
that
Hoffnungsloser Optimist
|
Nana, die schreibst schon du, und ich (oder sonstwer) sag(t) dir dann was du ändern kannst damits funktioniert.
|
-wrax-
<...>
|
lllooooooolllllll.... ok dann mach ich mal...
void main() { sportg *s[5];
s[0]=new wifusp;
s[0]->wifuspEingabe(); (sportg (*s[0])).sportgEingabe();
//und jetzt sollte er wieder beides ausgeben... //macht er zwar, aber fur den menschen unkenntlich
s[0]->wifuspAusgabe(); (sportg (*s[0])).sportgAusgabe();
getch(); }
|
that
Hoffnungsloser Optimist
|
Nachdem ich die fehlenden #includes ergänzt habe, meint MSVC:
wrax.cpp(45) : error C2503: 'sportg' : base classes cannot contain zero-sized arrays
(und ein paar Folgefehler)
...compilierfähigen Code solltest du schon zusammenbringen.... Wenn du keine Arraygröße angibst, wird auch kein Speicher reserviert.
Wenn man das fixt, kommt:
wrax.cpp(105) : error C2039: 'wifuspEingabe' : is not a member of 'sportg' wrax.cpp(10) : see declaration of 'sportg'
Wie bereits erwähnt, fehlen hier die Casts (dafür sind die anderen unnötig und syntaktisch falsch)
Diese Hürde überwunden, und damit den Compiler befriedigt, merkt man beim Linken, dass bei einigen Methoden die Implementierung fehlt.
Wenn das Programm dann endlich läuft, stellt man fest, dass durch Entfernen der falschen Typecasts plötzlich auch der Output korrekt ist...
|
-wrax-
<...>
|
dann sag mir bitte wie ich richtig caste...
(im turboc compiler machts ihn nix, wenn man array ohne groeße macht.... ich habe jetzt in meinen vorigen post, die wifuspEingabe, wifuspAusgabe in der klasse sportg virtuell bereichert)
|
that
Hoffnungsloser Optimist
|
In diesem Fall kannst du dir alle Casts ersparen. Allerdings wird dein Code mit Arrays ohne Größe irgendwelche Speicherbereiche überschreiben, was bei dir nur rein zufällig so aussieht als würde es funktionieren. Generell: Nur weil es dein Compiler verzeiht, ist es noch lange nicht korrekt. Das gilt übrigens für Webdesign genauso (nicht alles was im IE irgendwas anzeigt ist eine korrekte Webseite).
|
Guest
Deleted User
|
deine Anwendung schautma stark nach standard-datenverwaltung aus. da wärst du IMHO mit einer Access-basierenden Lösung besser beraten als das in C++ hinzupfuschen
|