Feld aus Klasse an Hauptprogramm übergeben
-
Also beim Aufruf natürlich mit 'fldaten[n]', da er mir da ja sonst nur die Adresse des Feldes und nicht die Werte ausgibt.
-
Ooooha.
Zuerst mal ein Wort zu Deiner Schnittstelle: schlecht.
Was bringt es dem Benutzer Deiner Klasse, ein Array zu haben, in dem verschiedene Werte gespeichert sind? Da muss er sich ja merken, an welchem Index sich welcher Wert befindet etc. Besser ist es, für jeden Wert eine Methode zur Verfügung zu stellen, über die der Benutzer den Wert abfragen kann.
Zur Abfrage: Du tust so, als sei das Array eine Methode und greifst per
fldaten.daten();darauf zu -- das ergibt aber keinen Sinn, denn das Array ist nunmal keine Methode.Außerdem macht Dein Zugriff nichts: Du schreibst weder Werte rein noch liest welche aus.
Zu guter Letzt: was erwartest Du Dir von diesem Aufruf:
cout << fldaten;? Dass das nicht klappt, wirst Du schon bemerkt haben. Um Deine Klasse auszugeben, musst Du gewisse Methoden bereitstellen, damit C++ weiß, *wie* es Deine Klasse ausgeben soll.Noch eine Bemerkung: achte auf die Einrückung. Blöcke gehören immer eingerückt. Folgendes ist daher schlecht:
while (flnr <=999) flnr = rand()%10000;Dieser Code hat auch mehrere andere Nachteile aber darauf gehe ich jetzt mal nicht ein (lies mal den FAQ-Artikel hier im Forum betreffend Zufallszahlen).
Folgender Code wäre ein Beispiel, wie man "besser" auf Deine Klasse zugreifen könnte, ohne dieses (recht komische) Array:
class Flugzeug { private: int flnr, fltyp, flarrival, anfrage, flclose, flabsturz; public: void daten(); int GetFlNr() const { return flnr; } int GetFlTyp() const { return fltyp; } // ... und so weiter, für den Rest der Mitglieder. };Noch etwas: man programmiert allgemein in Englisch, soll heißen, alle Bezeichner sollten englisch sein.
Das 'const' hinter den Methoden besagt, dass der Aufruf dieser Methode das Objekt nicht verändert (tut er ja auch nicht, es wird lediglich etwas zurückgegeben).
-
Aaah alles klar....
ich werd es gleich mal ausprobieren.
Danke!
-
wenn du per cout auf die daten zugreifen willst,musst du den oprator<< (global) überladen
ostream& operator<<(ostream& os,zufall& klasse) { for(int i=0;i<n /* n ist die länge deines arrays */ ; i++) { os << klasse.fldaten[i] << " "; } return os; }naja,so oder so ähnlich..
-
Konrad Rudolph schrieb:
Noch etwas: man programmiert allgemein in Englisch, soll heißen, alle Bezeichner sollten englisch sein.
wenn du schon auf solche spitzfindigkeiten eingehst... man sollte auch anständige bezeichner für seine methoden wählen und keine kryptischen. getFlugzeugNummer() ist zwar länger, aber auch eindeutiger als getFlNr().
-
thordk schrieb:
wenn du schon auf solche spitzfindigkeiten eingehst... man sollte auch anständige bezeichner für seine methoden wählen und keine kryptischen. getFlugzeugNummer() ist zwar länger, aber auch eindeutiger als getFlNr().
ACK. Ich habe halt nur den Originalcode abgewandelt.
-
Also meine Klasse sieht nun so aus:
class Flugzeug { private: int flnr, fltyp, flarrival, anfrage, flclose, flabsturz; public: void daten(); int GetFlNr() const { return flnr; } int GetFlTyp() const {return fltyp; } int GetFlArrival() const { return flarrival; } int GetFlAbsturz() const { return flabsturz; } int GetFlClose() const { return flclose; } int GetFlAnfrage() const {return anfrage; } }; void Flugzeug::daten(void) { srand( time(NULL) ); flnr=1; while (flnr <=999) flnr = rand()%10000; fltyp=0; while (fltyp <=0) fltyp = rand()%4*10; flarrival=0; while (flarrival <=0) flarrival = rand()%10*10; anfrage = rand()%2; flclose=0; }Wie kann ich nun die Daten im Hauptprogramm aufrufen??? Ich bin wahrscheinlich zu blöd dafür

-
über die methoden
Flugzeug f; cout << "FlNr: " << f.GetFlNr() << endl;
-
mit dem punkt-operator die nötige funktion (methode) aus der klasse aufrufen
int main() { Flugzeug flugzeug1; cout << "Nummer: " << flugzeug1.GetFlNr(); return 0; }
-
Prima. Jetzt geht es. Besten Dank!!!!

-
Mh.... allerdings übergibt er mir irgendwelche Werte. Sind nicht die, die ich in der Klasse generiert habe ?!
-
Playkid schrieb:
Mh.... allerdings übergibt er mir irgendwelche Werte. Sind nicht die, die ich in der Klasse generiert habe ?!
Doch, das sollten genau diese Werte sein. Bist Du sicher, dass Du die Methode 'daten' vorher aufgerufen hast?
Außerdem sind das halt nunmal Zufalls-Werte.
-
Also in meinem Hauptprogramm sieht es nun so aus:
#include <iostream> #include "flugzeug2.h" using namespace std; int main() { Flugzeug f; cout << "Flugnummer: " << f.GetFlNr() << endl; cout << "Flugzeugtyp: " << f.GetFlTyp() << endl; cout << "Ankunft: " << f.GetFlArrival() << endl; cout << "Absturz: " << f.GetFlAbsturz() << endl; return (0); }wo soll ich da die methode 'daten' noch aufrufen?
-
dort,wo du sie auch in deinem ersten code aufrufen wolltest
am anfang der programs bzw. bevor du irgendwelche werte rausliest
-
Ja jetzt habe ich es.... endlich. Sorry dass ich mich so dumm angestellt hab

-
srand(time(0)); ruft man nur einmal (am besten zu beginn des programms) auf.
-
Wenn ich die Klasse in meinem Programm mehrmals aufrufen möchte, z.B. in einer Schleife, werden mir immer wieder die gleichen Zufallsparameter übergeben. Wenn ich das Programm neu startet, sind es immer andere Werte.
Wie bekomme ich es hin, dass bei mehrmaligen Aufruf der Klasse auch unterschiedliche Zufallswerte übergeben werden?
-
In den ANSI-C-FAQ: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39331-and-highlight-is-zufall.html
oder per Forumssuche:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-174310-and-highlight-is-zufall.htmlGruß,
Simon2.
-
srand( time(NULL) ); aus der klasse raus und in die main packen.
-
Besten Dank.