lit-web Geschrieben 26. März 2010 Geschrieben 26. März 2010 Ok danke den Fehler habe ich behoben, nun habe ich aber einen anderen Fehler den ich nicht so ganz nachvollziehen kann (was wahrscheinlich auch an meiner Unerfahrenheit liegt). Mir wird da aus einer Methode die Variable count ganz komisch angezeigt. Naja und da wusste ich nun auch nicht wirklich nach was ich Googeln sollte. Ich habe auch mal eine Grafik angehangen. Die Zahl 2009091631 ist die Zahl die ausgegeben wird anstelle der Zählwert der vectorelemente. Hier mal mein Code. #include <iostream> #include <stdlib.h> #include <string> #include <vector> using namespace std; class VectorFilled{ protected: vector <float> artPrices; int count; private: float *wert; public: /* * * hauptconstructor * */ VectorFilled(){} /* * * methode zum füllen des vectors * */ void vectorFilledPrices(float *wert){ do{ count = 0; cout<< "Wert eingeben "; cin>> *wert; artPrices.push_back(*wert); count++; } while(!cin.fail() == true); } /* * * destructor * */ ~VectorFilled(){}; }; /* * * klasse für das auslesen des vectors * */ class ReadVector: public VectorFilled{ private: int i; public: ReadVector(){} /* * * vector inhalt auflisten * */ void showVector(){ for(i = 0; i < count; i++){ cout<<artPrices[i]; } } /* * * zählwert vectorelemte ausgeben * */ void showVectorWert(){ cout<< count; } ~ReadVector(){}; }; int main(){ float artWert; VectorFilled filled; /* vector füllen klasse instanzieren */ ReadVector readed; /* vector auslesen klasse instanzieren */ filled.vectorFilledPrices(&artWert); /* vector mit eingabedaten füllen */ cout<<endl<<endl; readed.showVector(); /* aufgelisteten vectorinhalt ausgeben */ readed.showVectorWert(); /* zählwert enthaltener vectorelemente ausgeben */ return 0; } Das sind meine ersten Schritte hier mit Klassen, das prozedurale und funktionale habe ich durch. Vielen Dank für eure Hilfe. Zitieren
lilith2k3 Geschrieben 26. März 2010 Geschrieben 26. März 2010 (bearbeitet) Gegenvorschlag: #include <iostream> #include <stdlib.h> #include <string> #include <vector> using namespace std; class myVectorClass { vector <float> artPrizes; public: void Push(float wert){ artPrizes.push_back(wert); } void PrintVector() { for(int i=0; i < (int)artPrizes.size(); i++) {cout << artPrizes[i] << endl; } } void PrintVectorSize(){ cout << artPrizes.size(); } }; int main() { myVectorClass myVector; float wert; while(cin >> wert) { myVector.Push(wert); } myVector.PrintVector(); return(EXIT_SUCCESS); } Bearbeitet 26. März 2010 von lilith2k3 Zitieren
Klotzkopp Geschrieben 27. März 2010 Geschrieben 27. März 2010 Ok danke den Fehler habe ich behoben, nun habe ich aber einen anderen Fehler den ich nicht so ganz nachvollziehen kannDann mach dafür bitte einen neuen Thread auf. Das Board ist themenzentriert, nicht benutzerzentriert. Dein neues Problem hat nichts mehr mit "undefined reference" zu tun, also sollte es auch nicht in einem Thread mit diesem Titel behandelt werden. Ich habe das mal für dich abgetrennt. VectorFilled filled; /* vector füllen klasse instanzieren */ ReadVector readed; /* vector auslesen klasse instanzieren */Du hast zwei Vectoren. In den einen schreibst du die Werte rein, aus dem anderen versuchst du dann, die Anzahl auszulesen. Das klappt natürlich nicht. Ganz allgemein zur Objektorientierung: Mit Klassen modelliert man in aller Regel Objekte, nicht Tätigkeiten. Eine Klasse mit der Beschreibung "vector füllen" oder "vector auslesen" klingt komisch.Wenn du einen Konstruktor anlegst, der dann aber nichts tut, kannst du ihn dir auch sparen. Der Compiler generiert dann automatisch einen für dich. Gleiches gilt für den Destruktor. Wenn sowieso nichts drinsteht, weglassen.Du solltest die Variable count im VectorFilled-Konstruktor mit 0 initialisieren.Wenn du count bei jedem Schleifendurchlauf in vectorFilledPrices wieder auf 0 setzt, wirst du nicht über 1 hinauskommen.Du brauchst gar nicht mitzuzählen, wieviele Elemente du in den vector gesteckt hast. std::vector hat eine size-Methode, die dir genau das zurückgibt.Es ist nicht ersichtlich, warum ReadVector von VectorFilled erbt. Public-Vererbung drückt eine "ist-ein"-Beziehung aus. Ein ReadVector ist ein VectorFilled? Klingt komisch, aber dazu siehe oben.Deine Fehlerbehandlung der Eingabe ist fehlerhaft. Du prüfst zwar auf cin.fail, aber erst, nachdem du einen möglicherweise fehlerhaft eingelesenen Wert in den Vector gesteckt hast. Siehe lilith2k3s Code für eine bessere Eingabeschleife.Der Parameter wert in vectorFilledPrices verdeckt den gleichnamigen Member. Welchen Zweck hat der Parameter überhaupt? Weder wird darüber ein Wert an vectorFilledPrices übergeben, noch wird einer rausgegeben. Dann leg doch besser eine lokale Variable in vectorFilledPrices an. Und wozu gibt es diesen Member überhaupt? Und warum Zeiger?"== true" ist überflüssig. Du hast schon einen bool-Ausdruck, daran ändert sich nichts, wenn du ihn nochmal mit true vergleichst. Zitieren
lit-web Geschrieben 27. März 2010 Autor Geschrieben 27. März 2010 (bearbeitet) Ok Klotzkopp und lilith2k3, danke erst mal für eure Antworten. Ich dachte wenn ich jetzt gleich ein 2 Thema aufmache wäre das nicht so gut, werde mir das aber für de Zukunft merken. Und warum Zeiger, ich wollte mal ein wenig mit Zeigern rum spielen, nur scheint mir der sinnvolle Einsatz noch wirklich schlüssig zu sein. Vieleicht wenn es keine Umstände macht kann mir einer den sinnvollen Einsatz von Zeigern mal etwas näher bringen, ich weis was Zeiger machen, aber diese sinnvoll einzusetzen macht mir dann doch noch Verständnisprobleme. Klotzkopp ich stecke nicht wirklich so tief in der OOP (in php ein wenig). Ok ich werde das alles nochmal überdenken. Vielen Dank jedenfalls. Bearbeitet 27. März 2010 von lit-web Zitieren
lilith2k3 Geschrieben 29. März 2010 Geschrieben 29. März 2010 (bearbeitet) Zeiger sind immer dann interessant, wenn Du Daten für Funktionen verfügbar halten willst, ohne gleich alles auf einmal kopieren zu lassen (call by reference vs. call by value). Vorallem in der OOP kann das interessant sein, wenn man bedenkt, daß bei einer Übergabe als value nicht nur das gesamte Objekt mit übergeben würde, sondern es wird ein neues (temporäres) Objekt erzeugt, welches dann per Konstruktor initialisiert wird. Anschließend wird der Kopierkonstruktor des ursprünglichen Objekts aufgerufen; und schlussendlich, wenn das temporäre Objekt seinen Dienst getan hat, wird dessen Destruktor aufgerufen. Ein Prozess der zeit und rechenintensiv ist. Statt eines kompletten Objekts übergeben zu wollen ist es also sinnvoll, einen Zeiger auf das Objekt zeigen zu lassen und so auf das Ursprungsobjekt zugreifen zu können. Oder man nutzt stattdessen die sog. Referenzen, die im Grunde den gleichen Dienst tun, aber ein sprachlich schöneres Mittel darstellen. Bearbeitet 29. März 2010 von lilith2k3 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.