Hallo LUG,
ich habe wieder einmal eine allgemeine C++ -Frage zu meiner unten angehängten Klassendefinition. Ich habe im Private-Teil einen Int- eger "az" deklariert. Wenn ich in der Methode "load" einer Instanz von object3d die Variable "az" auf z.B. 225 setze, müsste der ge- setzte Wert dann z.b. aus der Methode "draw" abrufbar sein?? Ich habe die einfachste Variante (einfache Zuweisung mit az=225; und cout << az; in einer anderen Methode) auch probiert und erhalte in der anderen Methode prinzipiell den Wert az=0. Ist das so richtig, und falls ja, wie kann ich sonst az für alle Methoden der Klasse zugänglich machen?
Matthias
p.s. ich hänge mal zur Sicherheit den kompletten Quelltext als tar.bz2 an. Die entscheidende Stelle ist in der object3d-Methode "draw", die im Prinzip den Wert von az benötigt, der vorher in der Methode "load" erzeugt wurde.
<SCRAP> /* object3d.h */
class object3d { private: struct line3d { int xa,ya,za; // Anfangskoordinaten int xe,ye,ze; // Endkoordinaten }; line3d *lines[50]; // 50 Vektorspeicher int az; // Anzahl d. Linien int xrot,yrot,zrot; // Drehwinkel der Achsen public: object3d(); // Konstruktor ~object3d(); // Destuktor int load(char *filename); // 3D-Objekt aus Datei laden int setrot(int xr, int yr, int zr); // Rotationswinkel setzen int draw(int xo, int yo, int zo); // Zeichnen mit Offset }; </SCRAP>
Am Montag, dem 22. Januar 2001 um 00:36:49, schrieb Matthias Petermann:
ich habe wieder einmal eine allgemeine C++ -Frage zu meiner unten angehängten Klassendefinition. Ich habe im Private-Teil einen Int- eger "az" deklariert. Wenn ich in der Methode "load" einer Instanz von object3d die Variable "az" auf z.B. 225 setze, müsste der ge- setzte Wert dann z.b. aus der Methode "draw" abrufbar sein??
Ja, die folgende heruntergekochte Version Deines Programmes funktioniert wie erwartet:
#include <iostream> class object3d { private: int az; // Anzahl d. Linien public: void load () { az = 225; } void draw () { cout << az << endl; } }; main() { object3d *test3d; test3d=new object3d(); test3d->load(); test3d->draw(); return(0); }
Torsten
Hallo Matthias,
Du hast Recht. Im Prinzip ist das so.
On Mon, Jan 22, 2001 at 12:36:49AM +0100, Matthias Petermann wrote:
... Ich habe im Private-Teil einen Int- eger "az" deklariert. Wenn ich in der Methode "load" einer Instanz von object3d die Variable "az" auf z.B. 225 setze, müsste der ge- setzte Wert dann z.b. aus der Methode "draw" abrufbar sein??
Ja, das ist so.
Deine Klassendefinition ist auch ok, der Hund liegt in
16 int object3d::load(char *filename) 17 { 18 char test[100]; 19 char ch; 20 21 filebuf buffer; 22 int a=0, b=0, z=0; 23 int az=0; // Anzahl der Linien 24 25 if (buffer.open(filename,input) == 0)
In der Zeile 23 machst Du az zu einer lokalen (bezogen auf object3d::load()) Variable, damit verdeckst Du az aus der Klassendefinition. Dumm gelaufen ;)
Best regards from Dresden/Germany Viele Gruesse aus Dresden Heiko Schlittermann
On Mon, Jan 22, 2001 at 12:36:49AM +0100, Matthias Petermann wrote:
Hallo LUG,
der anderen Methode prinzipiell den Wert az=0. Ist das so richtig, und falls ja, wie kann ich sonst az für alle Methoden der Klasse zugänglich machen?
Um das Ganze mal abzukürzen, du hast einen ganz simplen Fehler gemacht. Schau dir mal die Funktion object§d::load() an, dort steht ziemlich am Anfang die Zeile
int az=0;
Was will uns das sagen? Wenn du az jetzt inkrementierst, greifst du nicht auf das in der Klasse definierte az zu, sondern auf das dieser Funktion. Wenn load beendet wird, wird der entsprechende Speicher wieder freigegeben, ohne daß sich das eigentliche az verändert hätte. Ich nehme mal an, die Zeile soll 'az=0;' heißen.
Matthias
Ulf
Hallo Torsten, Heiko, Ulf...
ich möchte mich ganz herzlich für Eure Hilfe zu meinem kleinen Problem bedanken. Zugegeben, es sind immer diese kleinen "Schusselfehler", die man selbst bei zehnmaligem Nachlesen des Quelltextes übersieht. Als Programmier-Anfänger bereiten mir teilweise noch simpleste Probleme Kopfzerbrechen, aber immerhin habe ich heute mit gdb einen Segmentation Fault in meinem Pro- gramm aufgespürt :) (der wäre fast schon meine nächste Frage an euch gewesen, ebenso peinlich wie die erste ;)
Viele Grüße,
Matthias
lug-dd@mailman.schlittermann.de