Objektorientiertes Programmieren
-
Hallo, abend zusammen
Ich hab eine frage bezüglich Objektorientiertes Programmieren OOP!
Ich habe in c ein Programm geschrieben welches ich unten gepostet habe.
Als nächstes wollt ich das Objektorientiert programmieren.Die Aufgabe heisst:
Der bisherige Inhalt des Hauptprogramms in eine Methode: Start ausgelagert werden.
Alle Module(Funktionen) sollen nun Methoden werden.
Zusätzlich soll eine weitere Methode: FileWrite entworfen werden, die alle während eines
Programmlaufes eingegebenen Daten und die Ergebnisse von Berechnungen in eine (neue) CSV –
Datei exportiert. Diese kann dann als Protokolldatei (logfile) betrachtet werden.
[Für die Dateiarbeit sollen letztlich in b.) die C++ - Möglichkeiten genutzt werden.]
Bei Programm-Ende soll auf Wunsch der aktuelle Inhalt der Protokolldatei aufgelistet werden können.Wie geht man am besten vor ? könnte mir jemand ein kleines Beispiel dazu geben wie daas funktioniert!?
Was solen bei mir die Attributen sein ?
#include <stdio.h> #include <math.h> #include "col_conio.h" void eingabe(float umsatz_unternehmen[12][2], char monate[12][12]); // Deklariere Modul eingabe void ausgabe(float umsatz_unternehmen[12][2], char monate[12][12]); // Deklariere Modul ausgabe void mw(float umsatz_unternehmen[12][2]); // Deklariere Modul mw ( mittelwert ) void std(float umsatz_unternehmen[12][2]); // Deklariere Modul std( Standardabweichung ) void minimum(float umsatz_unternehmen[12][2]); // Deklariere Modul minimum void maximum(float umsatz_unternehmen[12][2]); // Deklariere Modul maxmimum int pruefung(char first_use) { int m; while(1) { printf("\n\nMenue 1: Umsaetze\nMenue 2: Ausgabe Umsaetze\nMenue 3: Mittelwert\nMenue 4: Standardarabweichung\nMenue 5: Min/Max\nMenue 0: Beenden\nAuswahl: "); fflush(stdin); scanf("%i", &m); if( m<0 || m>5 ) // nicht innerhalb des auswahlbaren bereich { printf("\nUngueltige Eingabe!\n\n"); } else if( m != 0 && m != 1 && first_use ) { printf("\nBitte geben sie erstmal die Umsaetze ein!\n\n"); } else { printf("\n"); return m; } } } int main() { char monate[12][12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" }; float umsatz_unternehmen[12][2]; // zweidimensionales Umsatz int input; char first_use = 1; while( 1 ) { switch( pruefung(first_use) ) { case 1: cls(); eingabe(umsatz_unternehmen, monate); // Aufruf Modul eingabe printf("Danke fuer den Input!\n\n"); first_use = 0; //Funktion wurde genutzt, umsaetze sind drin, 2,3,4,5 können benutzt werden! break; case 2: cls(); ausgabe( umsatz_unternehmen, monate ); // Aufruf Modul ausgabe break; case 3: cls(); printf("\t[Mittelwert]\n"); mw( umsatz_unternehmen ); // Aufruf Modul Mittelwert break; case 4: cls(); printf("\t[Standardabweichung]\n"); std( umsatz_unternehmen ); // Aufruf Modul Standardabweichung break; case 5: cls(); printf("\t[Min/Max]\n"); printf("\n\nMIN/MAX Filiale |A| anzeigen (1/0)- ? -\n\n"); scanf("%i",&input); if ( input == 1 ) { minimum( umsatz_unternehmen ); //Aufruf Modul minimum } printf("\n\nMIN/MAX Filiale |B| anzeigen (1/0)- ? -\n\n"); scanf("%i",&input); if (input == 1) { maximum( umsatz_unternehmen ); // AufrufbModul maximum } break; case 0: printf("\n[Programm Ende!]"); return 0; default: // <Funktionsaufruf zum saubermachen des Programms dann beenden!> printf("\n\nFehler im Switch\n\n"); return 0; } } getchar(); // Programm Pause } void eingabe(float umsatz_unternehmen[12][2], char monate[12][12]) // Definition Funktion eingabe { int i; int j; int n = 11; printf("\tHandelsfirma A & B GmbH\n"); for(j=1;j<=1;j++) { printf( "\nBitte geben Sie die Umsaetze fuer Unternehmen A ein:\n" ); for(i=0;i<=n;i++) { do{ printf("Bitte %i -ten Umsatz fuer %s 2007\n",i+1,monate[i]); // Eingabeaufforderung printf("Eingabe:");fflush(stdin);scanf("%f",&umsatz_unternehmen[i][0]); }while(umsatz_unternehmen[i][0] < 0 ); // Eingabe solange wiederholen, } // bis eingabe größer NULL *Neu hinzugefügt* printf( "\nBitte geben Sie die Umsaetze fuer Unternehmen B ein:\n" ); for(i=0;i<=n;i++) { do{ printf("Bitte %i -ten Umsatz fuer %s 2007\n",i+1,monate[i]); // Eingabeaufforderung printf("Eingabe:");fflush(stdin);scanf("%f",&umsatz_unternehmen[i][1]); } while(umsatz_unternehmen[i][1] < 0); // Eingabe solange wiederholen, // bis eingabe größer NULL *Neu hinzugefügt* } } } void ausgabe(float umsatz_unternehmen[12][2], char monate[12][12]) // Definition Modul ausgabe { int i; printf("--------------------------------------------------------------------------------\n"); printf(":::::::::::::::::::::Filiale A:::::::::::::::::::Filiale B::::::::::::::::::::::\n"); for (i=0; i<=11; i++) { printf("%5i. %10s 2007 %10.2f EU",i+1 ,monate[i],umsatz_unternehmen[i][0]); //Ausgabe Umsatz, Monat printf("%5i. %10s 2007 %10.2f EU",i+1 ,monate[i],umsatz_unternehmen[i][1]); //Ausgabe Umsatz, Monat printf("\n"); // inkl. Tabelarische Ausgabe } printf("\n--------------------------------------------------------------------------------"); } void mw(float umsatz_unternehmen[12][2]) // Definition Modul mw (mittelwert) { int i = 0; // Definieren Lokale Variablen float summe = 0; float mittelwert = 0; float summe_2 = 0; float mittelwert_2 = 0; for (i = 0; i <=11; i++) { summe += umsatz_unternehmen[i][0]; } mittelwert = summe/=12; for(i = 0; i < 11; i++) { summe_2 +=umsatz_unternehmen[i][1]; } mittelwert_2 = summe_2/=12; printf("\nMittelwert Filiale |A|:%.2f",mittelwert); printf("\nMittelwert Filiale |B|:%.2f",mittelwert_2); } void std(float umsatz_unternehmen[12][2]) // Definiere Modul std ( Standardabweichung ) { int i = 0; // Definieren Lokale Variablen float summe = 0; float mittelwert = 0; float summe_2 = 0; float mittelwert_2 = 0; float s = 0; float s_2 = 0; for (i = 0; i <=11; i++) { summe += umsatz_unternehmen[i][0]; } mittelwert = summe/=12; for(i = 0; i < 11; i++) { summe_2 +=umsatz_unternehmen[i][1]; } mittelwert_2 = summe_2/=12; for(i = 0; i <=11; i++) { s += (umsatz_unternehmen[i][0] - mittelwert)*(umsatz_unternehmen[i][0] - mittelwert); } s /= 12; s = sqrt( s ); for(i = 0; i <=11; i++) { s_2 += (umsatz_unternehmen[i][1] - mittelwert_2)*(umsatz_unternehmen[i][1] - mittelwert_2); } s_2 /= 12; s_2 = sqrt( s_2 ); printf("\nStandardabweichung der Umsaetze Filiale |A|:%.2f\n",s); // Ausgabe Standadaw. FILIALE 1 printf("\nStandardabweichung der Umsaetze Filiale |B|:%.2f\n",s_2); // " " " 2 } void minimum(float umsatz_unternehmen[12][2]) // Definiere Modul minimum { int i = 0; // Definiere Lokale Variablen float min = 0; float max = 0; min = umsatz_unternehmen[i][0]; // Setze min erste eingegebene Umsatz max = umsatz_unternehmen[i][0]; // Setze max erste eingegebene Umsatz for(i = 0; i <=11; i++) { if ( min > umsatz_unternehmen[i][0] ) // |WENN| min größer ist als Umsatz min = umsatz_unternehmen[i][0]; // dann ist der neue WERT min } for (i = 0; i <=11; i++) { if (umsatz_unternehmen[i][0] > max) // WENN umsatz größer ist als max max = umsatz_unternehmen[i][0]; // dann ist der Neue WERT max } printf("\t\nMinimal Umsatz Filiale |A|: %.2f ",min); // Ausgabe Min Filiale 1 printf("\t\nMaximal Umsatz Filiale |A|: %.2f ",max); // Ausgabe Max Filiale 2 } void maximum(float umsatz_unternehmen[12][2]) { int i = 0; // Setze & Definiere Lokale Variablen float min = 0; float max = 0; min = umsatz_unternehmen[i][1]; // Setze min erste eingegebene Umsatz max = umsatz_unternehmen[i][1]; // Setze max erste eingegebene Umsatz for (i = 0; i <= 11; i++) { if ( min > umsatz_unternehmen[i][1] ) min = umsatz_unternehmen[i][1]; } for(i = 0; i <=11; i++) { if (umsatz_unternehmen[i][1] > max) max = umsatz_unternehmen[i][1]; } printf("\t\nMinimal Umsatz Filiale |A|: %.2f ",min); printf("\t\nMaximal Umsatz Filiale |B|: %.2f ",max); }gruß
-
Mach Objekte aus den Teilen, die zusammengehören.
http://de.wikipedia.org/wiki/Objektorientierte_Programmierung
-
Objekte die zummsangehören inwiefern zusammengehören?
Ich kauf mir am besten morgen c++ von von erlenköttter.
Erklärmir bitte nur wie du das da meinst. Objekte bilden die zusammengehören bezogen auf mein code.
gruß
-
Am besten fängst du an dir zu überlegen worums in deinem Programm geht, nach kurzem Überfliegen geht es wohl um Unternehmen mit Filialen, die Umsätze haben.
Also wäre wohl eine Klasse Unternehmen ganz günstig. Und da es scheinbar auch Filialen gibt, könnte man dafür auch eine Klasse machen. Die Filialen gehören wahrscheinlich zu den Unternehmen, deswegen sollten sie Klassenattribute sein. Dann stellst du diverse Berechnungen an. Jetzt kannst du dich entscheiden ob du dafür ne extra Klasse mit statischen Memberfunktionen machst oder das Ganze als Klassenmethoden gestaltest. Dafür musst du dir eben genauer anschauen, wie das Programm aufgebaut ist.
Dann hast du noch ein Logfile, dafür kannst du auch ne Klasse nehmen, die hat dann das Handle auf die Datei als Attribut und ein paar Klassenmethoden die in das File schreiben oder es ausgeben.
Hoffe das hilft dir weiter
-
hallo
warum nicht einfach alles in einer Klasse werfen?
-
hasso schrieb:
hallo
warum nicht einfach alles in einer Klasse werfen?
Weil womöglich ein Unternehmen auch mehrere Filialen haben kann, die ja ihrerseits wieder spezifische Daten aufweisen.
Es wäre ausserdem sehr hilfreich, wenn du in Zukunft deinen grundlegenden Aufbau in wenigen Sätzen schildern könntest. Es hat nicht jeder Lust, 328 Zeilen Code zu lesen.
-
Hallo,
Es geht im Programm darum das man für 2 Fialialen seperat 12 Umsätze einliest und ausgibt . anschließend wird von jeder Filiale der Mittelwert, Standardabweichung und der kleinste und größte Umsatz ausgebeben!
So jetzt auch keine 328 Zeilen Code mehr lesen.Wie ist das denn in C++ mit Übergabeparameter & Klassen??
Muss man die Variablen alle unter private einfach abspeichern ?
dann benötigt man auch nicht die übergabeparameter?
oder kann man es in der in der Methode definieren?Zum Code:
In der Klasse InputOutput sollen Umsätze ein & ausgelesen werden. In der Klasse
Calculation sollen alle berechnungen stattfinden!#include <iostream> #include <stdio.h> using namespace std; class InputOutput { private: public: void eingabe(); void ausgabe(); void start(); }; class Calculation { private: public: void mittelwert(); void stdabw(); void min(); void max(); void start(); }; int pruefung(char first_use) { int m; while(1) { printf("\n\nMenue 1: Umsaetze\nMenue 2: Ausgabe Umsaetze\nMenue 3: Mittelwert\nMenue 4: Standardarabweichung\nMenue 5: Min/Max\nMenue 0: Beenden\nAuswahl: "); fflush(stdin); scanf("%i", &m); if( m<0 || m>5 ) // nicht innerhalb des auswahlbaren bereich { printf("\nUngueltige Eingabe!\n\n"); } else if( m != 0 && m != 1 && first_use ) { printf("\nBitte geben sie erstmal die Umsaetze ein!\n\n"); } else { printf("\n"); return m; } } } void InputOutput::start(void){ char monate[12][12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" }; float umsatz_unternehmen[12][2]; // zweidimensionales Umsatz int input; char first_use = 1; while( 1 ) { switch( pruefung(first_use) ) { case 1: //cls(); printf("\t[I N P U T\n]"); printf("Danke fuer den Input!\n\n"); first_use = 0; break; case 2: //cls(); printf("\t[O U T P U T]\n"); break; case 3: //cls(); printf("\t[M I T T E L W E R T]\n"); break; case 4: //cls(); printf("\t[S T A N D A R D A B W E I C H U N G]\n"); break; case 5: //cls(); printf("\t[M I N -/- M A X]\n"); printf("\n\nMIN/MAX Filiale |A| anzeigen (1/0)- ? -\n\n"); scanf("%i",&input); if ( input == 1 ) { } printf("\n\nMIN/MAX Filiale |B| anzeigen (1/0)- ? -\n\n"); scanf("%i",&input); if (input == 1) { } break; case 0: printf("\n[Programm Ende!]"); default: printf("\n\nFehler im Switch\n\n"); } } getchar(); } void InputOutput::eingabe(float umsatz_unternehmen[12][2], char monat[12][12]){ int i; int j; int n = 11; printf("\tHandelsfirma A & B GmbH\n"); for(j=1;j<=1;j++) { printf( "\nBitte geben Sie die Umsaetze fuer Unternehmen A ein:\n" ); for(i=0;i<=n;i++) { do{ printf("Bitte %i -ten Umsatz fuer %s 2007\n",i+1,monate[i]); printf("Eingabe:");fflush(stdin);scanf("%f",&umsatz_unternehmen[i][0]); }while(umsatz_unternehmen[i][0] < 0 ); } printf( "\nBitte geben Sie die Umsaetze fuer Unternehmen B ein:\n" ); for(i=0;i<=n;i++) { do{ printf("Bitte %i -ten Umsatz fuer %s 2007\n",i+1,monate[i]); printf("Eingabe:");fflush(stdin);scanf("%f",&umsatz_unternehmen[i][1]); } while(umsatz_unternehmen[i][1] < 0); } } } int main(){ }
-
hasso schrieb:
Wie ist das denn in C++ mit Übergabeparameter & Klassen??
Muss man die Variablen alle unter private einfach abspeichern ?
dann benötigt man auch nicht die übergabeparameter?
oder kann man es in der in der Methode definieren?Ich empfehle dir, ein C++-Buch zu kaufen. Zur Not tun es auch Internet-Tutorials. Dir scheinen nämlich die Grundlagen zu Klassen zu fehlen, und diese werden dort besprochen.
Im Weiteren ist dein jetztiger Code immer noch um einiges zu lang. Es wäre manchmal auch praktisch, wenn du nicht immer deine aktuellen Probleme bringen würdest, sondern vereinfachten Beispielcode, der nur dazu dient, das Prinzip aufzuzeigen.
-
Ok. Ich schau mir gerade das video2brain an von c++ da ist ein Teil über OOP...
Eins würd ich noch wissen wollen, wie sieht das in C++ aus darf man anstatt cout & cin weiterhin printf() und scanf() benutzen ? sprich man müsste nur die Headerdatei #include <stdio.h> hinzufügen oder ?.
-
hasso schrieb:
Ok. Ich schau mir gerade das video2brain an von c++ da ist ein Teil über OOP...
Eins würd ich noch wissen wollen, wie sieht das in C++ aus darf man anstatt cout & cin weiterhin printf() und scanf() benutzen ? sprich man müsste nur die Headerdatei #include <stdio.h> hinzufügen oder ?.
<cstdio>Ja.
Darf man, solle man aber imho nicht.
-
Hallo, ich versuch mich mal an nem kleinen Klassenbeispiel:
ungetesteter und unkompilierter Code:
class Filiale{ private long umsatz[12]; private long min; private long max; private long avg; public Filiale(){} public void umsatzEinlesen(){ for(int i = 0; i < 12; i++){ cout << "Umsatz " << i+1 cin >> umsatz[i]; } } public void minimumBerechnen(){ //hier Minimum aus Array suchen min = tempMinimum; } public void maximumBerechnen(){ //hier Maximum aus Array suchen max = tempMaximum; } public void minimumBerechnen(){ //hier Durchschnitt aus Array bilden avg = tempAvg; } public long mimnimumAusgeben(){ return minimum; } public long maximumAusgeben(){ return maximum; } public long durchschnittAusgeben(){ return avg; } }und aufrufen würdest du das ganze mit sowas wie:
ungetesteter und unkompilierter Code
int main(){ Filiale fili = new Filiale(); fili.umsatzEinlesen(); }
-
hasso schrieb:
Als nächstes wollt ich das Objektorientiert programmieren.
Die Aufgabe heisst:
Der bisherige Inhalt des Hauptprogramms in eine Methode: Start ausgelagert werden.
Alle Module(Funktionen) sollen nun Methoden werden.
Zusätzlich soll eine weitere Methode: FileWrite entworfen werden, ...Hallo hasso,
Dein Vorgehen ist so typisch wie falsch. Das führt zu nichts, was man anschließend als 'objektorientiert' bezeichnen könnte, auch wenn Klassen und Methoden darin vorkommen.Wenn Du dem Wiki-Link gefolgt bist, hast Du vielleicht gelesen, dass es beim 'objektorientierten' darauf ankommt, Die Dinge zusammen zu bringen, die zusammen gehören und die Dinge zu trennen, die nichts miteinander zu tun haben. Und das völlig unabhängig davon, ob sich dabei um Daten oder Funktionen handelt.
Ich betrachte dazu mal das Array 'float umsatz_unternehmen[12][2]'. Ich habe es so verstanden, dass sich im Element umsatz_unternehmen[iMonat][iUnternehmen] der Umsatz befindet, den das Unternehmen 'iUnternehmen' im Monat 'iMonat' gemacht hat. Betrachten man zwei weitere Elemente umsatz_unternehmen[iMonat2][iUnternehmen] und umsatz_unternehmen[iMonat][iUnternehmen2], welches hat dann die stärke Bindung zum ersten?
Nun doch wohl das Element welches den gleichen Unternehmens-Index 'iUnternehmen' hat. Das sieht man auch an allen Deinen (for-)Schleifen. Du läufst immer über alle Umsätze eines Jahres von ein und demselben Unternehmen. Daraus folgt: die Umsätze eines Unternehmens bilden bereits eine Einheit (oder Objekt) - in diesem Fall das Unternehmen. Alles was in Deinem Programm ein Unternehmen ausmacht gehört in diese Klasse.
class Unternehmen { public: private: std::vector< double > m_umsaetze; // die monatlichen Umsätze };Als Speicher für die Umsätze benutze ich kein Array mit konstanter Größe und allen Nachteilen, sondern eine Klasse, die aus dem Template vector<> des C++-Standards instanziiert werden kann.
Wenn man Dein Programm näher anschaut, dann wird aus den Umsätzen der Mittelwert und die Standardabweichung sowie Minimum und Maximum bestimmt. Somit liegt es auf der Hand, zum Abfragen dieser Information Methoden zum 'Unternehmen' hinzuzufügen.
class Unternehmen { public: double umsatz_mw() const; // liefert den Mittelwert der monatlichen Umsätze double umsatz_stdabw() const; // liefert die Standardabweichung der gespeicherten Umsätze double umsatz_min() const; // liefert den kleinsten monatlichen Umsatz double umsatz_max() const; // liefert den größten monatlichen Umsatz private: std::vector< double > m_umsaetze; // die monatlichen Umsätze };Diese Methoden zu füllen, sollte kein großen Problem sein. Zur Berechnung der Standardabweichung schau Dir mal das Kapitel "Berechnung für auflaufende Messwerte" auf der Wiki-Seite 'Standardabweichung' ganz unten an.
Das könnte man zum Beispiel auch so lösen:
class StdAbw // Die Standardabweichung vieler Werte { public: StdAbw() // Initialisierung : m_sum( 0.0 ) , m_sumQ( 0.0 ) , m_n( 0 ) {} void operator()( double x ) // hinzufügen eines neuen Wertes { m_sum += x; m_sumQ += x * x; ++m_n; } double get() const // Wert der Standardabweichung abholen { using namespace std; // wg. std::sqrt // Formel für die Standardabweichung für 'Berechnung für auflaufende Messwerte' return sqrt( ( m_n * m_sumQ + m_sum * m_sum ) / m_n / (m_n - 1) ); } private: double m_sum; double m_sumQ; int m_n; }; // -- Implementierung der Methode 'umsatz_stdabw' double Unternehmen::umsatz_stdabw() const { return std::for_each( m_umsaetze.begin(), m_umsaetze.end(), StdAbw() ).get(); }for_each gehört auch zum C++-Standard und der Ausdruck ruft für jedes Element aus m_umsaetze die Methode StdAbw::operator() auf - fügt also den Wert der Standardabweichung hinzu.
Diese Klasse 'StdAbw' könne man dann wiederverwenden, weil sie weder was mit Unternehmen, noch mit Umsätzen noch mit 12 Monaten zu tun hat - so wie die Funktion 'std(..)'.
Für die Eingabe und Ausgabe in C++ gibt es cin und cout. Und zur 'Ausgabe eines Unternehmens' (hier z.B. Umsätze) bietet sich eine Funktion
std::ostream& operator<<( std::ostream& out, const Unternehmen& unternehmen );an, die man am Besten als 'friend' in der Klasse 'Unternehmen' deklariert.
.. damit soll für heute erst mal Schluss sein, auch wenn es noch lange nicht alles ist.
Gruß
Werner
-
Werner Salomon schrieb:
Für die Eingabe und Ausgabe in C++ gibt es cin und cout. Und zur 'Ausgabe eines Unternehmens' (hier z.B. Umsätze) bietet sich eine Funktion
std::ostream& operator<<( std::ostream& out, const Unternehmen& unternehmen );an, die man am Besten als 'friend' in der Klasse 'Unternehmen' deklariert.
Gruß
WernerDie Argumente allgemein sind natürlich völlig richtig und auch das Argument oben ist sicherlich richtig, aber ich denke für jemanden der gerade in die OOP hineinschaut ist vielleicht die Operatorüberladung etwas viel am Anfang. Da sie sich ja in dem Beispiel auch vermeiden lässt und ja als Ziel eher Übersichtlichkeit und Struktur des Programms im Vordergrund stehen, als eine Entwicklung für Wiederverwendung, würde ich in dem Fall dazu tendieren es vielleicht über eine Memberfunktion zu machen.
MfG Jasc
-
Ich hab mir 2 Klassen überlegt eine InputOutput & Unternehmen die führt die Berechnnungen eines Unternehmen aus .Ich denke der Zusammenhang ist ok.
Als nächstes wie sieht es mit den Variablen aus, sollte man die Variablen in einer Klasse definieren unter Private oder in der Methode selbst ?
class InputOutput{ private: public: void input(); void output(); }; class Unternehmen{ private: public: void mittelwert(); void standabw(); void MinMax(); };
-
Generell würde ich vor allem bei grösseren und komplexeren Klassen folgenden Aufbau empfehlen:
class MyClass { private: // Variabeln als privat deklarieren static short Classes; // statische Membervariable (z.B. wieviele Instanzen existieren) int var1, var2; double var3; public: MyClass(); // Mehrere Konstruktoren MyClass(int a, int b, double c); // ... int GetV1() const; // Getter und Setter, um sicherer Daten void SetV1(int V1); // zu manipulieren };In den Methoden kannst du keine instanzspezifischen Variabeln deklarieren. Wenn du mehrere Instanzen einer Klasse hast, werden (selbst statische) Variabeln in den Funktionen überschrieben. Deshalb müssen sie nicht-statische Member der Klasse sein - statische Membervariabeln im Gegensatz existieren nur einmal pro Klasse, also nicht spezifisch für jede Instanz.
Bei kleineren Klassen (z.B. für eine komplexe Zahl) kannst du es aber auch einfacher machen:
struct Complex // struct, damit nicht man nicht public schreiben muss { double real; // zwei öffentliche Membervariabeln double imag; }
-
Hallo,
Hab ein kleines beispiel Programm gemacht um dabei die fragen zu lösen.
Als erstes eine Fehlermeldung pop "Instanz" is corrupted.
2. Fehlermeldung wenn ich das Array monate[12][12].. unter Private deklariere in der Klasse InputOutput folgt eine Fehlermeldung -> : Syntaxfehler: '{'
1>c:\users\hasso\music\documents\visual studio 2008\projects\aufgabe4\aufgabe4\aufgabe4.cpp(12) : error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionstext wird übersprungen
Warum geht das nicht?Wenn das Array in der Methode deklrariert wird klappts.
#include <iostream> #include <cstdlib> #include <cstdio> using namespace std; class InputOutput{ private: float umsatz[12]; public: void eingabe(); void ausgabe(); }; class Unternehmen{ private: public: void mittelwert(); void standabw(); void MinMax(); }; void InputOutput::eingabe(){ int i; printf("Geben Sie 12 Umsaetze ein!"); for(i = 1; i <= 12; i++) { printf("\n%i Eingabe:",i);scanf("\n%f",&umsatz[i]); } } void InputOutput::ausgabe(){ char monate[12][12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}; int i; for (i = 1; i <= 12; i++){ printf(" %.2f %s\n",umsatz[i],monate[i]); } } int main(){ InputOutput pop; // setze Instanz! pop.eingabe(); pop.ausgabe(); }
-
Du kannst eben in der Klasse selber eine Variable nur deklarieren und definieren, aber nicht initialisieren (Begriffe siehe hier). Initialisierungen müssen von aussen oder in einer Memberfunktion ablaufen.
An deiner Stelle würde ich es im Konstruktor erledigen (das ist die Memberfunktion, die beim Erstellen des Objekts aufgerufen wird):
class MyClass { private: int Var; // Deklaration und Definition der Variable public: MyClass(); // Standardkonstruktor (Deklaration) }; MyClass::MyClass() // Konstruktor (Definition) { Var = 4; // Initialisierung der Variable }Oder direkt in der Elementinitialisierungsliste (das ist aber im Moment noch nicht so wichtig - ich würde mich zuerst mit Klassen, Konstruktoren und Memberfunktionen ausführlich auseinandersetzen):
MyClass::MyClass() // Konstruktor (Definition) : Var(4) // Initialisierung der Variable { }Statt char-Arrays würde ich dir unbedingt zu
std::stringraten. Auch die STL könnte dir nützlich sein (z.B.std::vector<>)
-
Wo genau erscheint dieser Fehler?
Zu 2. Ein Array kannst du nicht in der Deklaration definieren. Das muss im ctor geschehen und dort kannst du das auch nicht per Initialisierungsliste machen. Das heisst, du musst das Array im ctor ganz einfach per Zuweisung füllen.
-
Nexus schrieb:
Variabeln Variabeln Membervariabeln Membervariabeln
vielleicht möchtest du deinen kompetenten beiträgen in zukunft noch den letzten professionellen schliff verpassen, indem du das wort "Variable" richtig schreibst?
-
deutschlehrer schrieb:
Nexus schrieb:
Variabeln Variabeln Membervariabeln Membervariabeln
vielleicht möchtest du deinen kompetenten beiträgen in zukunft noch den letzten professionellen schliff verpassen, indem du das wort "Variable" richtig schreibst?
Vielleicht möchtest Du Deinen inkompetenten Beiträgen in Zukunft noch den letzten professionellen Schliff verpassen, indem Du Groß- und Kleinschreibung korrekt verwendest?