Bitte um Hilfe
-
Moin,
Ich beschäftige mich nun seit ein paar Tagen wieder mit C++, nachdem ich mein "Jetzt lerne ich C++" aus der Ecke hervor geholt habe.
Derzeit bin ich bei den Klassen und habe hier nun ein Problem, nicht etwa mit dem Programm selber sondern mit der Unzureichenden erklärung des Autors.
Leider wird in der Erklärung des Quellcodes zu keinem Zeitpunkt auf den Abschnitt über:
void SetUpperLeft(Point Location) { itsUpperLeft = Location; } void SetLowerLeft(Point Location) { itsLowerLeft = Location; } void SetUpperRight(Point Location) { itsUpperRight = Location; } void SetLowerRight(Point Location) { itsLowerRight = Location; }Eingegangen.
Nun würde ich aber gerne Wissen wofür das ganze da ist und wie man es benutzt. Ich habe nun schon seit gut einer halben Stunde versucht irgendwas damit zu machen oder herauszufinden wozu es den nun eigentlich da ist.
Großes Problem für mich ist, das ich nicht verstehe warum in SetUpperRight ein neues Point Objekt erstellt wird. Ich weiß leider auch nicht was bei
itsUpperLeft = Location
passiert.
Da bisher auch noch nicht darauf eingegangen wurde was geschieht wen man einem Objekt ein anderes des selben Typs zuweist.Werden dabei die werte von Location in itsUpperLeft kopiert?
Dabei frage ich mich dann, was daraus den Kopiert werden soll, den Location hat doch keine Werte zugewiesen bekommen.
#include <iostream.h> class Point { public: void SetX(int x) { itsX = x; } void SetY(int y) { itsY = y; } int GetX()const { return itsX; } int GetY()const { return itsX; } private: int itsX; int itsY; }; class Rectangle { public: Rectangle ( int top, int left, int bottom, int right); ~Rectangle () {} int GetTop() const { return itsTop; } int GetLeft() const { return itsLeft; } int GetBottom() const { return itsBottom; } int GetRight() const { return itsRight; } Point GetUpperLeft() const { return itsUpperLeft; } Point GetLowerLeft() const { return itsLowerLeft; } Point GetUpperRight() const { return itsUpperRight; } Point GetLowerRight() const { return itsLowerRight; } void SetUpperLeft(Point Location) { itsUpperLeft = Location; } void SetLowerLeft(Point Location) { itsLowerLeft = Location; } void SetUpperRight(Point Location) { itsUpperRight = Location; } void SetLowerRight(Point Location) { itsLowerRight = Location; } void SetTop(int top) { itsTop = top; } void SetLeft(int left) { itsLeft = left; } void SetBottom(int bottom) { itsBottom = bottom; } void SetRight(int right) { itsRight = right; } int GetArea() const { int Width = itsRight-itsLeft; int Height = itsTop-itsBottom; return (Height * Width); } private: Point itsUpperLeft; Point itsLowerLeft; Point itsUpperRight; Point itsLowerRight; int itsTop; int itsBottom; int itsLeft; int itsRight; };Hier der Code des Programms das die Klasse verwenden soll, vielleicht hilft euch das Nachzuvollziehen weshalb ich die funktionsweise der Klasse nicht komplett nachvollziehen kann.
(Leider ist das auch schon das ende des Kaptiels über Klassen)#include <cstdlib> #include "rect.hpp" Rectangle::Rectangle(int top, int left, int bottom, int right) { itsTop = top; itsLeft = left; itsBottom = bottom; itsRight = right; itsUpperLeft.SetX(left); itsUpperLeft.SetY(top); itsUpperRight.SetX(right); itsUpperRight.SetY(top); itsLowerLeft.SetX(left); itsLowerLeft.SetY(bottom); itsLowerRight.SetX(right); itsLowerRight.SetY(bottom); } using namespace std; int main(int argc, char *argv[]) { int top=100,left=20,bottom=50,right=80; Rectangle MyRectangle (top, left, bottom, right ); int Area = MyRectangle.GetArea(); cout << "Flaeche: " << Area << endl; cout << "Obere linke X-Koordinate: "; cout << MyRectangle.GetUpperLeft().GetX()<< endl; system("PAUSE"); return EXIT_SUCCESS; }Ich hoffe mal das ich mich jetzt nicht als kompletter voll idiot geoutet habe, also bitte habt Nachsicht mit einem blutigen Anfänger!
Gruß
Muffin
P.S
Ich habe mir noch wärend des Schreibens noch einige Gedanken über Location gemacht.
Ich vermute jetzt einfach mal, das einfach im Quellcode selbst ein Point Objekt deklariert wird, welches dann an SetUpperLeft übergeben wird. Demnach wäre Location einfach nur ein Parameter, wie bei einer variablen der dann bei verwendung der funktion durch das gewünschte objekt ersetzt wird.
Wen ich mit meinen Überlegungen jetzt richtig liege, stellt SetUpperLeft() eine Schnittstelle da mit der ich direkt auf itsUpperLeft zugreifen kann bzw. dem Objekt werte zuweisen kann. Mit hilfe eines Point Objekts kann ich dann die Werte Manipulieren und übergeben.
Was mich hierbei ein wenig ärgert ist das der Autor so etwas einführt es aber nicht weiter erklärt. Ich hab keine stelle gefunden in der Erklärt wurde was passiert wen man einer funktion ein Objekt übergibt bzw. das das möglich ist, und was bei Objekt1=Objekt2 passiert.
Ich hoffe mal das dabei später im buch bei Vererbung und Polymorphie auf dinge dieser art eingegangen werden.
-
Hallo
Ist doch wunderbar, dass du es alleine gelöst hast.
chrische
-
-
chrische5 schrieb:
Hallo
Ist doch wunderbar, dass du es alleine gelöst hast.
chrische
Dem entnehme ich jetzt einfach mal das ich die Lösung wohl gefunden habe.
Ich möcht dabei mal auf eine Compiler Warnung zu sprechen kommen die mein dev-C++ immer ausgibt.
32:2 C:\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
Ich kann damit jetzt nicht so richtig was anfangen, worüber beschwert er sich nun?
EDIT: Danke für den Link, das werd ich mal durch lesen!
-
Hallo
Mach mal das .h nach iostream weg. Schreib also einfach
#include <iostraem>uns schreibst dann noch
using namespace std;drunter und alles wird gut. Du kannst alternativ ber auch immer:
std::coutund so weiter schreiben.
chrische
-
Erstmal vielen dank für die Hilfe.
Ich hab nun mal probeweise ein kleine Programm geschrieben und hab hier nun ein Problem, erstmal der Code:
#include <iostream> using namespace std; class Ressourcen { public: Ressourcen (int Arbeiter); ~Ressourcen() {} int Metall(int Metall, int Arbeiter) { itsMetall = Metall; itsMetall = Arbeiter * 3; return itsMetall; } int Sillizium(int Sillizium, int Arbeiter) { itsSillizium = Sillizium; itsSillizium = Arbeiter * 2; return itsSillizium; } int Deuterium(int Deuterium, int Arbeiter) { itsDeuterium = Deuterium; itsDeuterium = Arbeiter * 1; return itsDeuterium; } void SetArbeiter(int Arbeiter) { itsArbeiter=Arbeiter; } int GetMetal() const { return itsMetall; } int GetSillizium() const { return itsSillizium; } int GetDeuterium() const { return itsDeuterium; } private: int itsArbeiter; int itsMetall; int itsSillizium; int itsDeuterium; }; main() { Ressourcen MyRessourcen(int Arbeiter); int Arbeiter; cin >>Arbeiter; MyRessourcen.SetArbeiter(int Arbeiter); return 0; }Wieso kann ich keine werte an SetArbeiter übergeben? Was mach ich den da falsch?
P.S
Ich habe mir mittlerweile das Tutorial ein wenig angesehen, und finde es im großen und ganzen garnicht schlecht, aber der Autor beschreibt kaum was er da gerade tut bzw. warum.
Ist das ganze eher ein Tutorial für fortgeschrittene?
Im großen und ganzen auf jedenfall sehr hilfreich!

-
Hi,
Erstmal int main()...auch wenn dein Compiler int bei fehlendem Typen annimmt ist das nicht Standard!
so isses richtig (du hast Typen gesetz, wo keine hingehören):
int main() { int iArbeiter, iAndererArbeiter; cin >> iArbeiter; Ressourcen MyRessourcen(iArbeiter); // ein anderer Arbeiter: cin >> iAndererArbeiter; MyRessourcen.SetArbeiter(iAndererArbeiter); return 0; }
-
Moin,
vielen dank für die schnelle hilfe, scheint nun soweit alles richtig zu sein, aber nun meckert der linker rum!
Fehlermeldung:
[Linker error] undefined reference to `Ressourcen::Ressourcen(int)'
ld returned 1 exit statusIch verwende übrigens Dev_C++.
#include <iostream> using namespace std; class Ressourcen { public: Ressourcen (int Arbeiter); ~Ressourcen() {} int Metall(int Metall, int Arbeiter) { itsMetall = Metall; itsMetall = Arbeiter * 3; return itsMetall; } int Sillizium(int Sillizium, int Arbeiter) { itsSillizium = Sillizium; itsSillizium = Arbeiter * 2; return itsSillizium; } int Deuterium(int Deuterium, int Arbeiter) { itsDeuterium = Deuterium; itsDeuterium = Arbeiter * 1; return itsDeuterium; } void SetArbeiter(int Arbeiter) { itsArbeiter=Arbeiter; } int GetMetal() const { return itsMetall; } int GetSillizium() const { return itsSillizium; } int GetDeuterium() const { return itsDeuterium; } private: int itsArbeiter; int itsMetall; int itsSillizium; int itsDeuterium; }; int main() { int ersterArbeiter, Arbeiter; cin >> ersterArbeiter; Ressourcen MyRessourcen(ersterArbeiter); cin >>Arbeiter; MyRessourcen.SetArbeiter(Arbeiter); system("PAUSE"); return 0; }
-
Du hast den Konstruktor von Ressourcen ja auch nicht definiert.
-
Braunstein schrieb:
Du hast den Konstruktor von Ressourcen ja auch nicht definiert.
lol, jo...
Hab ich gar nicht drauf geachtet...also der muss so aussehen:// in der Klasse unter public: Ressourcen (int iArbeiter) { itsArbeiter = iArbeiter; }
-
Du hältst wohl nichts von Initialisierungslisten?
Ressourcen (int iArbeiter) : itsArbeiter(iArbeiter) {}
-
Du hältst wohl nichts von Initialisierungslisten?
Elementinitialisierer heißen die...lol...ne halte ich nicht :p
-
Initialisierungsliste
ändere deine Meinung lieber. Glaub mir, es ist besser so.
-
Hm also mein C++ Buch sagt: Elementinitialisierer...aber is summa sumarum auch wuRscht

-
Vielen dank für die Hilfe!
Nun läuft das ganze soweit, nur hab ich aus irgendeinem grund einen Pufferüberlauf

Ich hab jetzt ne ganze weile versucht den fehler zu finden, aber ich kann ihn nirgends entdecken!
Hätte nicht gedacht das mir wen ich das gelernte mal anwende so viele fehler unterlaufen, wo es doch eigentlich etwas ganz simples ist

Ressourcen.hpp
#include <iostream> using namespace std; class Ressourcen { public: Ressourcen::Ressourcen(int init_Arbeiter){ itsArbeiter=init_Arbeiter; } ~Ressourcen() {}; int Metall() { int Metall = itsArbeiter; itsMetall = (Metall * 3); return itsMetall; } int Sillizium() { int Sillizium = itsArbeiter; itsSillizium = (Sillizium * 2) ; return itsSillizium; } int Deuterium() { int Deuterium; Deuterium = itsArbeiter; itsDeuterium = (Deuterium * 1); return itsDeuterium; } void SetArbeiter(int Arbeiter) { itsArbeiter=Arbeiter; } int GetMetall() const { return itsMetall; } int GetSillizium() const { return itsSillizium; } int GetDeuterium() const { return itsDeuterium; } int GetArbeiter() const { return itsArbeiter; } private: int itsArbeiter; int itsMetall; int itsSillizium; int itsDeuterium; };Ressourcen.cpp
#include "Ressourcen.hpp" int main() { int init_Arbeiter; cout << "Geben sie die Anzahl der Arbeiter ein: "; cin >> init_Arbeiter; Ressourcen MyRessourcen(init_Arbeiter); cout << "Ihre Arbeiter erwirtschaften " << MyRessourcen.GetMetall() <<" Metall, "; cout << MyRessourcen.GetSillizium() << " Sillizium, und \n" << MyRessourcen.GetDeuterium()<< " Deuterium." << endl; cout << "Anzahl der Arbeiter: " << MyRessourcen.GetArbeiter() <<endl; system("PAUSE"); return 0; }P.S
Der Pufferüberlauf betrifft nur die Ressourcen, itsArbeiter bleibt unverändert bei dem was ich über cin eingebe.
-
Also ersten weiß ich nicht, ob wir unter Pufferüberlauf das gleiche verstehen, und zweitens ist es sinnvoller, da man einen Pufferüberlauf (=Speicherzugriffsverletzung) so sehr schwer erkennen kann, wenn du mit nem Debugger ans Werk gehst...Beschreib mal deinen Fehler genauer

Wo tritt der Fehler genau auf ?
-
Hehe, ok

Also der Wertebereich wird überschritten, so wie es aussieht.
Geben sie die Anzahl der Arbeiter ein: 100
Ihre Arbeiter erwirtschaften 2008948848 Metall, -1 Sillizium, und
2009055971 Deuterium.
Anzahl der Arbeiter: 100
Drücken Sie eine beliebige Taste . . .Ich hab schon nach nem debugger gesucht, aber entweder ich bin blind oder da gibts keinen

-
Ich hab schon nach nem debugger gesucht, aber entweder ich bin blind oder da gibts keinen
Welchen Compiler hasse denn ?
-
Bloodshed Dev-C++

-
Vielleicht solltest du die internen Variablen auch mal initialisieren. In denen steht jetzt nämlich nur Müll drin. Wozu hast du diese anderen Funktionen erzeugt (Deuterium() usw.). Aufrufen tust du sie ja nicht.
PS. Silizium schreibt man mit einem l.