Konstruktor Poblemm ?
-
Allso ich habe folgendes problem ...
Wen ich mein Programm Compiliere was auch ohne probleme klappt und mir ein array mässiges objekt erstelle aus meiner klasse "punkt_3D_klasse" und dann zum letzten eintrag im array (gehe bei 5 arrays eintrag 4) und mir von den 3 Variablen die werte ausgeben lase erhalte ich immer irgendwelche zahlen anstadt 0 wie ich im Konstruktor angegeben habe woher kommt das ? Funktionierte an der Stelle der Konstruktor nicht so das den Variablen keine Werte zugewiesen wurden und so eine Zufällige zahl rauskommt die im RAM an den Platz standt ?#include <cstdlib> #include <iostream> using namespace std; class punkt_3D_klasse { int x_pos,y_pos,z_pos; public : punkt_3D_klasse(void){ x_pos = 0; y_pos = 0; z_pos = 0; } int get_position(int k){ int rv; switch(k){ case 0: rv = x_pos; break; case 1: rv = y_pos; break; case 2: rv = z_pos; break; } return rv; } bool move(int r,int w) { bool rv = 0; switch(r){ case 0: x_pos+=w; rv = 1; break; case 1: x_pos-=w; rv = 1; break; case 2: y_pos+=w; rv = 1; break; case 3: y_pos-=w; rv = 1; break; case 4: z_pos+=w; rv = 1; break; case 5: z_pos-=w; rv = 1; break; } return rv; } }; int main(int argc, char** argv) { int x; cout<<"Wieviele 3D Punkte sollen erstellt werden ?"<<endl; cin>>x; x--; punkt_3D_klasse punkt[x]; int action; int p_choose = 0; int move = 0; int choo = 0; while(true){ system("cls"); cout<<"Momentaner punkt: "<<p_choose<<endl<<"Was willst du tuen ?"<<endl<<"0 = Punkt waehlen. 1 = Position ausgeben. 2 = Bewegen."<<endl; cin>>action; switch(action){ case 0: system("cls"); cout<<"Punkt 0 bis "<<x<<" verfuegbar."<<endl<<"Bitte Waehlen :"<<endl; cin>>p_choose; break; case 1: system("cls"); cout<<"Position: "<<punkt[p_choose].get_position(0)<<"x"<<punkt[p_choose].get_position(1)<<"x"<<punkt[p_choose].get_position(2)<<endl; system("pause"); break; case 2: system("cls"); cout<<"Richtung Waelen:"<<endl<<"0 = x+ | 1 = x- | 2 = y+ | 3 = y- | 4 = z+ | 5 = z-"<<endl; cin>>choo; cout<<"Wie weit ?"<<endl; cin>>move; if(punkt[p_choose].move(choo,move)){ cout<<"Fertig"<<endl; } else { cout<<"Es hat sich ein Fehler ereignet"; } system("pause"); break; default: system("cls"); cout<<"Ungueltige Auswahl !"<<endl; system("pause"); } } system("pause"); return 0; }
-
Erstens sind VLAs (Arrays, deren Größe erst zur Laufzeit vorgegeben wird) im C++ Standard nicht zugelassen - sowas gibt es nur in C99. In C++ gibt es stattdessen die STL-Container.
Zweitens gibst du bei einer Array-Definition die Anzahl der Elemente an, nicht den Index des letzten Elements. (d.h. wenn der Nutzer 5 eingibt, erschaffst du ein Array für 4 Elemente und greifst mitpunkt[4]auf Werte außerhalb dieses Arrays zu)Edit: Und die Methoden der Punkt-Klasse sehen auch noch etwas unausgereift aus.
-
Zweitens gibst du bei einer Array-Definition die Anzahl der Elemente an, nicht den Index des letzten Elements. (d.h. wenn der Nutzer 5 eingibt, erschaffst du ein Array für 4 Elemente und greifst mit punkt[4] auf Werte außerhalb dieses Arrays zu)
Das habe ich schon berücksichtigt. Ok das mit den arrays werde ich mir nochmal Angucken.
Ok nein ich habe gedacht ich habe es berücksichtigt Danke

-
CStoll schrieb:
VLAs (...) sowas gibt es nur in C99. In C++ gibt es stattdessen die STL-Container.
In C++ gibt es stattdessen leider gar nix. Zumindest nix vergleichbares

-
TomHalo schrieb:
Zweitens gibst du bei einer Array-Definition die Anzahl der Elemente an, nicht den Index des letzten Elements. (d.h. wenn der Nutzer 5 eingibt, erschaffst du ein Array für 4 Elemente und greifst mit punkt[4] auf Werte außerhalb dieses Arrays zu)
Das habe ich schon berücksichtigt.
Nein, eher im Gegenteil - durch das
x--;hast du die zu geringe Arraygröße überhaupt erst provoziert
-
TomHalo schrieb:
Das habe ich schon berücksichtigt. Ok das mit den arrays werde ich mir nochmal Angucken.
Ok nein ich habe gedacht ich habe es berücksichtigt Danke

Ich bin mir nicht sicher, ob du CStolls Antwort verstanden hast. Es ist gerade deine "Berücksichtigung", die dir den Code kaputt gemacht hat. Dein Array hat bei Eingabe von beispielsweise 5 nur 4 Elemente und geht von 0 bis 3. Das liegt da dran, weil du von der 5 eins abziehst, bevor du das Array erstellst.
-
hustbaer schrieb:
CStoll schrieb:
VLAs (...) sowas gibt es nur in C99. In C++ gibt es stattdessen die STL-Container.
In C++ gibt es stattdessen leider gar nix. Zumindest nix vergleichbares

Naja, er muss bloß
#include<vector>machen und Zeile 68 ändern zuvector<punkt_3D_klasse> punkt(x);und er hat etwas was sich genau so verhalt wie ein VLA. Meinen Röntgenblick, wo die Daten dann physikalisch liegen, schalte ich mal aus.
-
ja das mit dem --x; meinte ich mit "Ich habe gedacht das ich es Betrücksichtigt habe" aber vorhin habe ich gesehen das das völliger müll war ... Es wird nämlich langsam Spät :p aber Danke habs jetzt auch mit Vektoren Gelöst.
Ich sollte mir das Denken um diese Uhrzeit Abgewöhnen.