C++ Klassenproblem!

Lord Nemesis

Semiprofi
Thread Starter
Mitglied seit
05.10.2003
Beiträge
1.208
Ort
's Schwoabaländle
Hi Leute!
Ich sehe in meinem Bsp den Fehler (Ausgabe geht nicht richtig) nicht, vielleicht ist ja einer von euch ein Profi?!

Danke!

statistik.h
PHP:
#ifndef _STATISTIK_h
#define _STATISTIK_h
#include <stdlib.h>

class Statistik{
      private:
              double werte[10];
              int anzahl;
      public:
             Statistik(void);
             void print(void);
      
      
      
      };

#endif


statistik.cpp
PHP:
#include "statistik.h"
#include <cstdlib>
#include <iostream>

using namespace std;

//Konstruktoren:

Statistik::Statistik(void){
                           double werte[]={3,7,5,8,1};
                           int anzahl = 5;
                           }
                                
//Operationen

void Statistik::print(void){
                            int i;
                            for(i = 0; i < anzahl; i++){
                                  cout << werte[i] << " ";
                                  }
                            }


main.cpp
PHP:
#include <cstdlib>
#include <iostream>
#include "statistik.h"

using namespace std;

int main() {
    
    Statistik stati1;
    
    stati1.print();
    
    
    
    system("PAUSE");
    return 0;
}
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Eieiei, schrecklich schrecklich. Fehler ohne ende. ;)
Zuerstmal gehst du das Konzept der Aufteilung der Dateien komplett Falsch an. In der ".h" Datei hast du normalerweise gar keine "#include" befehle. Nur in der dazugehörigen .cpp hast du ein "#include" Befehl der die Header Datei einbindet.

Wenn du das ganze Program kompilierst dann geschieht das auf zwei Wege. Zuerst wird nur "main.cpp" kompiliert. Und dann einmal "statistik.h" und "statistik.cpp". Danach hast du zwei Objekt Dateien, mit der Endung ".o". Diese werden dann zusammen gelinkt.

Dafür musst du normalerweise eine "Makefile" erstellen. Wenn du das nicht kannst, dann benutze die Projektverwaltung von Bloodshed Dev-C++. Ich denke mal du benutzen diesen IDE und Compiler?


Wenn du das nicht so über die Makefile machst, dann musst du die "#include" befehle anders verteilen. Besser ist dann aber du machst alles in eine Datei.

Hier mal die richtigen drei Dateien, auf deine Art:

main.cpp
PHP:
#include <iostream>
#include "statistik.h"
#include "statistik.cpp"

using namespace std;

int main()
{
    Statistik stati1;

    stati1.print();

    system("pause");
    return 0;
}
-Im Hauptprogramm includest du zuerst die Header Datei. Nachdem dies geschehen ist, includest du die "cpp" datei zu der Header Datei.
-cstdlib habe ich raus gelassen, da du die nicht brauchst.


statistik.h
PHP:
#ifndef _STATISTIK_h
#define _STATISTIK_h


class Statistik
{
    private:
        double m_werte[10];
        int m_anzahl;
    public:
        Statistik();
        void print(void);
};

#endif
-Also hier wird erstmal gar keine Datei included, brauchst du auch nicht.
-Ansonsten wird bei Variablen in einer Klasse immer ein "m_" davor gemacht. Bedeutet "Member-Variable". Musst du nicht machen, damit kannst du später im Programmcode besser unterscheiden welche Variablen zur Klasse gehören, und welche nicht.



statistik.cpp
PHP:
#include <iostream>

using namespace std;


Statistik::Statistik()
{
    m_werte[0] = 3;
    m_werte[1] = 7;
    m_werte[2] = 5;
    m_werte[3] = 8;
    m_werte[4] = 1;
    m_anzahl = 5;
}

void Statistik::print(void)
{
    for(int i = 0; i < m_anzahl; i++)
        cout << m_werte[i] << " ";
    cout << endl;
}
Hier hast du die meisten Fehler. ;)
-Es wird in deinem Fall nur die Dateien eingebunden die du extra benötigst um Funktionen auszuführen. Die Header Datei der Klasse musst du nicht nochmal extra einführen, da in deinem Fall die Header Datei sowieso schon im Main Programm vor der cpp Datei eingebunden wird.
- Im Konstruktor ist es volkommen Falsch nochmals "double werte[]..." hinzuschreiben. Damit würdest du eine neue Variable "werte" und "anzahl" deklarieren. Aber dein Ziel ist es doch die beiden Variablen in der Klasse zu verändern. Daher muss "double" und "int" weg lassen. Damit würdest du sonst beim erstellen eines Objektes, zwei neue Variablen "werte" und "anzahl" erstellen. Würdest diesem die Werte zuweisen. Dann beendet sich der Konstruktor, und die variablen werden gelöscht.

Deine Original Variablen innerhalb der Klasse, bleiben unverändert. Wenn du das Programm so ausführst, würde der einfach willkürlich irgendwelche Zufälligen Zahlen ausgeben, die sich gerade im Speicherbereich dieser Variablen befinden.

Daher hier "double" und "int" weg lassen.

-Weiterhin Funktioniert das zuweisen eines Arrays mit den geschweiften Klammer nur bei der erstellung des Arrays. Daher musst du hier auf jedes einzelne Index Manuel zugreifen, und es einem Wert zuweisen.

- Ansonsten nur kleiner Schönheitsfehler in der print() Funktion. Mache am Ende nochmal ein "cout << endl;" um damit nochmals ein zeilenvorschub zu machen. Sieht sonst häßlich in der Shell aus, wenn der Prompt nach Rechts eingerückt ist, und davor noch die Ausgaben des Programmes stehen.


Wie eine kleine Makefile gebaut wird, oder wie du das Programm Manuel kompilierst, kann ich dir nur auf Linux und mit dem gcc und g++ Compiler erklären. Ansonsten benutze wie gesagt vom Bloodsheed Dev-C++ die Projektverwaltung.


Ansonsten letzter Punkt angemerkt. Aus Sicherheitsgründen niemals system() verwenden und externe Programme aufrufen, die im System sind. Den diese Datei kann korrput sein. Oder eben verändert werden. Das ist eine große Sicherheitslücke. Weiterhin ist dein Programm damit nicht Portabel auf andere OSe.

Wenn du in einem fertigen programm einen Tastenstop einfügen möchtest, dann füge "conio.h" ein. Und benutzte stattdessen die "getch()" Funktion. Hat aber auch den Nachteil das, dass Programm nicht portabel ist. "getch()" Funktioniert z.B. so unter Linux nicht.

Zu Übungszwecken und zum Lernen, kannst du das natürlich alles drin lassen. Möchte das nur anmerken, wenn du dein Programm weiter geben möchtest.



P.S.:
Was heißt eigentlich Falsche Ausgabe? Ich konnte dein programm in der Form wie oben beschrieben nicht einmal Kompilieren lassen.

P.P.S:
Das nöchste mal bei Problemen bitte genau schreiben was ganz genau nicht geht. Wenn die Ausgabe "Nicht richtig" geht, dann Poste deine Ausgabe was du auf den Bildschirm bekommst. Weiterhin auch immer Kompilier Meldungen Posten.

Einfach einen Quellcode zu Posten und zu sagen. "Geht Nicht!" ist irgendwie nicht so toll. Demnächst also Problem ausführlich beschreiben, wo du genau ein Problem hast.
 
Zuletzt bearbeitet:
Danke Sid Burn!

Jetzt funktionierts richtig. Hab das mit dem neu definieren statt Werte zuweisen irgendwie übersehen.

Jetzt funktioniern auch meine anderen Operationen richtig (größter Wert, kleinster Wert, Durchschnitt, Zahl hinzufügen, Zahl löschen, etc...)

Danke auch für Deine weiteren Tipps, ich werde sie mir zu Herzen nehmen!

Ach ja, Bloodsheed hatte kompiliert, doch das Programm zeigte nur irgendwelche schnell durchlaufende Addressen und stürzte dann ab.


PS:
die neue statistik.cpp
PHP:
#include "statistik.h"
// #include <cstdlib>
#include <iostream>

using namespace std;

//Konstruktoren:

Statistik::Statistik(void){
                           stat_werte[0]= 3;
                           stat_werte[1]= 7;
                           stat_werte[2]= 5;
                           stat_werte[3]= 1;
                           stat_werte[4]= 4;
                           
                           stat_anzahl = 5;
                           }
                                
//Operationen

void Statistik::print(void){
                            int i;
                            for(i = 0; i < stat_anzahl; i++){
                                  cout << stat_werte[i] << " ";
                                  }
                            cout << endl;
                            }
 
Also bei Bloodshed empfehle ich dir halt einfach über die IDE eine Klasse hinzuzufügen. Einfach in den Linken spalt nen Rechtsklick machen und "Neue Klasse anlegen" (oder so ähnlich) auswählen. Der erzeugt dann automatisch eine .h und .cpp Datei.

Wenn du die im Programm einfügen möchtest, dann musst du nur die Header Datei in der main.cpp mittels include hinzufügen.

Ansonsten wenn die Funktionen deiner Klasse noch extra Header Dateien brauchen, fügst du die halt in der cpp Datei hinzu. Du musst aber so nichts mehr zwischen den 3 Dateien verlinken, dass macht er dann beim Kompilieren "automatisch".
 
Hier jetzt alle von der Aufgabe gewünschten Funktionen integriert :d :

statistik.h
PHP:
#ifndef _STATISTIK_h
#define _STATISTIK_h


class Statistik{
      private:
              double stat_werte[15];
              int stat_anzahl;
      public:
             Statistik(void);               //Arrey mit Werten erstellen
             void print(void);              //Bildschirmausgabe
             void speichern(double);        //eine Zahl anhängen
             int existiert(double);         //gibt es überhaupt...?
             void loeschen(double);         //eine Zahl löschen
             int wieoft(double);            //wie oft kommt die Zahl vor
             double minimum(void);          //kleinste Zahl
             double maximum(void);          //größte Zahl
             double durchschnitt(void);     //Durchschnitt
             double durchschnitt2(void);    //Durchschnitt ohne(1mal) die größte und kleinste Zahl
             int welchestelle(double);      //an welcher Stelle befindet sich...?
      };

#endif

statistik.cpp
PHP:
#include "statistik.h"
#include <iostream>

using namespace std;

//Konstruktoren:

Statistik::Statistik(void){
                           stat_werte[0]= 1.41;
                           stat_werte[1]= 11;
                           stat_werte[2]= 22;
                           stat_werte[3]= 3.3;
                           stat_werte[4]= 44;
                           stat_werte[5]= 55;
                           stat_werte[6]= 19.00;
                           stat_werte[7]= 200;
                           stat_werte[8]= 30.9;
                           
                           stat_anzahl = 9;
                           }
                                
//Operationen

void Statistik::print(void){
                            int i;
                            for(i = 0; i < stat_anzahl; i++){
                                  cout << stat_werte[i] << " ";
                                  }
                            cout << endl;
                            }

void Statistik::speichern(double zahl){
                             double temp_werte[15];
                             int i;
                             for(i = 0; i < stat_anzahl; i++) 
                                   temp_werte[i] = stat_werte[i];
                             stat_anzahl++;
                             temp_werte[i] = zahl;
                             for(i = 0; i < stat_anzahl; i++) 
                                   stat_werte[i] = temp_werte[i];
                             }
                             
int Statistik::existiert(double zahl){
                                int i, ok = -1;
                                for(i = 0; i < stat_anzahl; i++){
                                      if(stat_werte[i] == zahl)
                                                       ok++;
                                      }
                                return ok;
                                }
                                
void Statistik::loeschen(double zahl){
                                if(existiert(zahl) == -1){
                                       cout << "Gibts nicht" << endl;
                                       return;
                                       }
                                double temp_werte[15];
                                int i,j = 0;
                                for(i = 0; i < stat_anzahl; i++){
                                      if(!(zahl == stat_werte[i])){
                                               temp_werte[j] = stat_werte[i];
                                               j++;
                                               }
                                      }
                                stat_anzahl = j;
                                for(i = 0; i < stat_anzahl; i++) 
                                   stat_werte[i] = temp_werte[i];
                                }
                                
int Statistik::wieoft(double zahl){
                             return (existiert(zahl)+1);                             
                             }

double Statistik::minimum(void){
                             int i;
                             double min;
                             min = stat_werte[0];
                             for(i = 1; i < stat_anzahl; i++)
                                   if(stat_werte[i] < min)
                                         min = stat_werte[i];                                   
                             return min;                             
                             }
                             
double Statistik::maximum(void){
                             int i;
                             double max;
                             max = stat_werte[0];
                             for(i = 1; i < stat_anzahl; i++)
                                   if(stat_werte[i] > max)
                                         max = stat_werte[i];                                   
                             return max;                             
                             }
                             
double Statistik::durchschnitt(void){
                             int i;
                             double summe;
                             for(i = 0; i < stat_anzahl; i++)
                                   summe += stat_werte[i];
                             return (summe / (float)stat_anzahl);
                             }

double Statistik::durchschnitt2(void){
                             int i;
                             double summe;
                             for(i = 0; i < stat_anzahl; i++)
                                   summe += stat_werte[i];
                             summe = summe - (maximum() + minimum());
                             return (summe / (float)(stat_anzahl - 2));
                             }

int Statistik::welchestelle(double zahl){
                            int i;
                            for(i = 0; i < stat_anzahl; i++)
                                  if(stat_werte[i] == zahl){
                                        return (i+1);
                                        }
                            return -1;
                            }
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh