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.