Objektübergabe mit Array
-
Hallo zusammen,
ich habe ein kleines Problem in einem (mittlerweile) schon etwas größeren Programm was ich leider nicht gelöst bekomme. Ich habe schon mein gutes C++ von A-Z durch gewälzt, aber irgendwie hat mir das auch nicht weiter geholfen.
Ich habe den Code auf das Wesentliche reduziert.
Eine kurze Beschreibung; es gibt ein globales Objekt "kugel". Dieses soll je nach Benutzerwunsch mit einem beliebig großen Array belegt werden.
Dazu wird in der Main Direktive die Funktion Benutzereingabe(); aufgerufen. Hier kann der Benutzer dann Länge und Inhalt des Arrays ändern. Am Ende der Benutzereingabe werden dann die Werte übergeben. Sobald jedoch der Konstruktor verlassen wird, sind die Werte futsch – bzw. nicht ordentlich übergeben.
Was mach ich falsch? Ich probiere hier schon seit Donnerstag herum und bin sogar schon auf die abstruse Idee gekommen den = Operator zu überladen;.hat auch nix gebrachtVielen Dank schonmal im Voraus!
//main.cpp #include <cstdlib> #include <iostream> #include <cstdlib> #include <stdlib.h> #include <stdio.h> #include <ctype.h> #include <time.h> #include <conio.h> #include <fstream> #include <windows.h> #include "objekt.h" using namespace std; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// objekt kugel; void benutzereingabe(); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int main(){ benutzereingabe(); kugel.print_array(); getch(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void benutzereingabe(){ int laenge=1; double hoehe=15.1; double array[]={2}; double* arrayptr=array; int auswahl; cout<<"werte aendern? 0:nein 1: ja\n"; cin>>auswahl; if (auswahl==1){ cout<<"laenge array?\n"; cin>>laenge; for (int i=0; i<laenge;i++){ cout<<"wert "<<i+1<<" angeben\n"; cin>>*(arrayptr+i); } } kugel=objekt(hoehe, arrayptr, laenge); }//objekt.h #include <iostream> using namespace std; #ifndef _OBJEKT_H_ #define _OBJEKT_H_ class objekt{ private: double M_hoehe; double* M_array; double* M_arrayptr; int M_laenge_array; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public: objekt(){cout<<"Standard konstruktor\n";}; objekt(double, double*, int); ~objekt( ){ cout<<"\nObjekt zerstoert\n"; } void print_array(); }; #endif//objekt.cpp #include "objekt.h" #include <time.h> #include <windows.h> #include <conio.h> ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// objekt::objekt(double hoehe, double* arrayptr, int laenge){ cout<<"normaler konstruktor\n"; M_hoehe=hoehe; M_laenge_array=laenge; M_arrayptr=arrayptr; for (int i=0;i<M_laenge_array;i++){ cout<<"*arrayptr="<<*(arrayptr+i)<<"\n"; *(M_arrayptr+i)=*(arrayptr+i); } print_array(); cout<<"ende normaler konstruktor"; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void objekt::print_array(){ cout<<"\nprint array\n"; for (int i=0;i<M_laenge_array;i++){ cout<<*(M_arrayptr+i)<<"\n"; } }achja - Freund Google und die Forumssuche hab ich auch schon beschäftigt...mit eheher geringem Erfolg
//Edit: Da ich ein freund von Farben bin Code Tags => CPP Tags - evilissimo
-
- Dein Arraypointer zeigt auf ein statisches Array in einer Funktion. Dieses existiert nach verlassen dieser Funktion nicht mehr
- Du machst keinerlei Anstalten die Arraygröße zu ändern
- Du schreibst einfach wild in Speicher der dir nicht gehört
- Die Kopiersemantik deines Objekts (die Standardsemantik, da du nichts eigenes definiert hast) ist wahrscheinlich nicht das was du willst
- Globale Variablen sind in der Regel auch eher eine schlechte Idee, wenn man keinen guten Grund für sie hat und weiß worauf man sich einlässt. ("ich kann's nicht besser" und Faulheit sind keine gute Gründe)Das ganze ist auf so vielen Ebenen falsch konzipiert, dass man das nicht mehr retten kann. Da muss ein völlig neuer Programmaufbau her. Doch keine Panik: Nimm einfach
std::vectorund du hast mit einem Schlag alle genannten Probleme gelöst.edit: Und noch ein paar Sachen, wo ich schon dabei bin:
- In C++ fangen die C-Standardheader mit 'c' an und haben kein '.h' mehr am Ende, also zum Beispiel 'ctime' statt 'time.h'.
- Der einzige Header den du anscheinend überhaupt benutzt ist iostream. Wozu sind all die anderen da? Man sollte nur genau die Header einbinden die man wirklich braucht.using namespacein Headerdateien zu benutzen ist eine ganz schlechte Idee was die Wiederbenutzbarkeit der Header angeht. Also genau das, was man eigentlich nicht will.
- Dein Einrückungsstil ist dem Lesen eher hinderlich. 1-8 Leerzeichen als Einrückung sind viel übersichtlicher.
-
vielen dank erstmal.
wer auch noch auf das problem stößt; http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027 hier ists ganz gut erklärt