Dynamisch allokierte Vektoren in Klasse (Fehler bei Übergabe)
-
Die Ausgabe des folgenden Beispiels gibt mir nicht wie erwartet eine 0 aus. So wie die Ausgabe aussieht lässt es darauf schließen, dass der Zeiger auf nen leeren Speicherbereich zeigt. Kann mir jemand erklären warum das so ist? Nebenbei bemerkt: Ursprünglich hatte ich vor das ganze mit einem struct zu lösen, allerdings hat dies auch nicht geklappt.
PS: Bevor irgendwelche Leute es vorschlagen, einen std::vector darf ich leider nicht benutzen, weil es vorgabe vom Prof ist keinen zu benutzen.
Datei: main.cpp
#include <iostream> using namespace std; int main() { st4vector velocity(200); cout << velocity.x[0] << endl; return 0; }Datei: st4vector.h
class st4vector { public: st4vector(int indim); //standartinit ~st4vector(); // destructor int dim; double* t; double* x; double* y; double* z; };Datei: st4vector.cpp
#include "st4vector.h" st4vector::st4vector(int indim) { dim=indim; t=new double [dim]; x=new double [dim]; y=new double [dim]; z=new double [dim]; for(int i=0;i<dim;i++) { t[i]=0; x[i]=0; y[i]=0; z[i]=0; } } st4vector::~st4vector() { if(t){ delete [] t; delete [] x; delete [] y; delete [] z; t=0; x=0; y=0; z=0; } }
-
-
Du machst zwar sehr vieles falsch (Stichwort: Regel der großen Drei) oder schlecht (Stichwort: Jedes Objekt verwaltet genau eine Ressource (d.h. schreib Klassen, die genau einen Vector halten, dann eine weitere Klasse mit 4 dieser Vectoren. Sonst wird es sehr frickelig, wenn du bei einer Exception sauber abräumen möchtest)), aber an sich sollte dieser Code korrekt 0 ausgeben. Dies wird sich natürlich wegen obiger Fehler schon bei der kleinsten Änderung nicht mehr so sein, aber an sich ist die Ausgabe des Programm derzeit genau definiert. Daher: Ist das auch wirklich 1:1 das Programm mit der fehlerhaften Ausgabe?
-
Erstmal danke für die Hilfe.
@Seppj: Wie sähe denn sowas als "gutartiger" Code aus? Ich lerne C++ mehr oder weniger durch Try and Error und nachlesen aus dem Internet einzelner Beispiele. Und was ist die "Regel der großen Drei"? Mir ist schon klar das man das so vermutlich nicht schreiben würde, da es sich aber um ein numerisches/physikalisches Programm handelt und ich nur zwei Tage Zeit habe irgendwas zu machen habe ich einfach nicht die Zeit alles Perfekt auszuführen. Der Code so ansich sollte nichts desto trotz also funktionieren.
-
-
johkemstyle schrieb:
@Seppj: Wie sähe denn sowas als "gutartiger" Code aus?
So wie der von std::vector :p .
Ich lerne C++ mehr oder weniger durch Try and Error und nachlesen aus dem Internet einzelner Beispiele.
Das gilt als die schlechteste aller Lernmethoden. So lernst du erstmal wenig, weil du alles abschreibst und was du lernst ist nicht unbedingt richtig (oder gar gut), da niemand kontrollieren kann, was du überhaupt daraus lernst
Und was ist die "Regel der großen Drei"?
Hier wiederum wäre Google dein Freund. Dafür ist das Internet da, darum nenne ich solche Stichworte.
Mir ist schon klar das man das so vermutlich nicht schreiben würde, da es sich aber um ein numerisches/physikalisches Programm handelt und ich nur zwei Tage Zeit habe irgendwas zu machen habe ich einfach nicht die Zeit alles Perfekt auszuführen.
Nein! Das geht nicht um perfekt oder gut, sondern darum, dass es überhaupt funktioniert. Regel der großen Drei ist ganz fundamental wichtig, wenn du selber Klassen schreibst, die Ressourcen verwalten!
Wie kommt es eigentlich, dass du unter Zeitdruck echte Probleme lösen musst, dafür aber nicht die geeigneten Mittel benutzen darfst, sondern dir alles selber (schlecht) nachbasteln musst? Das ist doch Unsinn. Entweder lernt man etwas richtig oder übt es zumindest richtig. Aber zu lernen wie man es falsch/schlecht macht ist doch genau das was man nicht möchte!
Der Code so ansich sollte nichts desto trotz also funktionieren.
Nein, eigentlich auch nicht. Du hast hier gerade einen extremen Glücksfall (oder eher Pech, da du die Fehler nicht bemerkst). Genau dieses eine gezeigte Programm funktioniert so gerade eben. Das ist eher Zufall, als dass es an der Korrektheit deines Codes liegt. Du hast einen Haufen Bauklötze in die Luft geschmissen, die zufällig aufeinander gelandet sind und halten. Aber das ist keine stabile Konstruktion und von einmal zu feste Hingucken wird alles zusammenfallen.
-
johkemstyle schrieb:
Und was ist die "Regel der großen Drei"?
Bei Fragen dieser Art finde ich diese Website immer recht hilfreich. Ist noch nicht so bekannt, funktioniert aber gut!
-
Ah okay- einen Zuweisungsoperator habe ich auch, ich hielt es aber nicht für Sinnvoll den hier zu posten, da das mehr ablenkt als sonstwas tut.
Vielen Dank für die Hilfe- das Problem hat sich irgendwie von alleine nach dem löschen der Temp-Dateien zum Projekt von Visual Studio gelöst. (Keine Ahnung warum sowas ausschlaggebend sein kann)

Der Thread kann also geschlossen werden.