kann ein Klassenelement nicht ansprechen



  • hi
    hab ma ein problem:

    gegeben ist eine Klasse mit der internen variable(element in der klasse) "pos":

    das ist der konstruktor:

    CPrimObject::CPrimObject(CVector3 ppos)
    {
    	CPrimObject::pos = ppos;
    	printf("\nPRIMPOSX=%f\n",pos.x);
    	printf("PRIMPOSY=%f\n",pos.y);
    	printf("PRIMPOSZ=%f\n\n",pos.z);
    }
    

    soo, jetz denkt man eigentlich "pos" bekommt den wert vom argument des konstruktors zugewiesen. zb( CPrimObject obj(1,2,3); );
    Ausgabe:

    PRIMPOSX=1
    PRIMPOSY=2
    PRIMPOSZ=3

    dh pos hat einen wert.

    wenn ich jetz allerdings "pos" von ausserhalb der klasse anfrag liefert es 0,0,0:

    printf("SP1 POS: x=%f , y=%f , z=%f",obj.pos.x, obj.pos.y, obj.pos.z);
    

    warum ist die ausgabe jetz:
    x=0, y=0, z=0 ??

    danke im vorraus 😉



  • Hast es ein wenig komisch mit der Zuweisung gemacht usw ... Zeig mal bitte wie du die Klasse CPrimObject Deklariert hast ... ist CPrimObject::pos eine Klasse?



  • Würde jetzt einfach mal sagen, du gibst nicht das objekt aus dass du erstellt hast. 🤡



  • hier die ganzen deklarationen ob ich "pos" schreib oder "CPrimObject::pos" kommt eigentlich auf selbe raus, oder?

    class CPrimObject
    {
    public:
    	int ID;
    
    	CVector3 pos;
    
    	CBlockLine *BL;
    	CBlockCircle *BC;
    
    	//
    	CPrimObject(CVector3 ppos);
    
    	bool SetBlocks(int pcblocks,CBlockCircle *pbc, int plblocks , CBlockLine *pbl);
    
    	 ~CPrimObject();
    };
    
    ///  SPHERE TEST OBJECT with BC ///////////////////////////////
    
    class CSphereObj : public CPrimObject
    {
    public:
    
    	CVector3 pos,facevec;
    	float radius;
    	GLUquadricObj *quadsphere;
    
    	CSphereObj(CVector3 ppos, float pradius);
    	void Render();
    	~CSphereObj();
    };
    

    hier der kopf des konstruktors der abgeleiteten klasse:

    CSphereObj::CSphereObj(CVector3 ppos, float pradius) : CPrimObject( ppos)
    


  • Lern doch einfach mal nen Debugger zu verwenden



  • der debugger sagt mir dass pos.x pos.y pos.z im konstruktor noch 1/2/3 ist un nach der instanzbildung 0/0/0 ist



  • Wärs möglich dass Du pos von der Basisklasse initialisierst, und dann auf pos der abgeleiteten Klasse zugreifst?



  • Fehler entdeckt: in der abgeleiteten Klasse CSphereObj gabs noch ein element namens "pos", das wurde beschrieben mit 1/2/3 un das "pos" in CPrimObj wurde ausgegeben, was allerdings dann 0/0/0 war.
    hui

    danke trotzdem



  • ein paar Tips am Rande:
    - Datenelemente einer KLasse deklariert man normalerweise private und dazu dann bei Bedarf getter und setter methoden.
    - such mal im Netz nach dem Stichwort "Initialisierungsliste", damit sparst du dir im Konstruktor eine Kopie von ppos nach pos, indem du pos bei seiner initialisierung sofort richtig belegst.
    - schau im C++-Buch deiner Wahl mal nach den iostreams. printf() ist ein Relikt aus der C-Zeit, nutze lieber std::cout, das ist typsicher und leichter zu lesen im code.



  • ja danke pumuckl für die tipps.
    (normalerweise sind die variablen bei mir auch private und können mit setter getter
    geholt werden aber in der entwicklungsphase mach ich dann aus einfachheitsgründen erstmal alles public damit ich schnell überall zugreifen kann)

    @ Lord Jaxom : richtig das wars , hab das "pos" in der andren klasse versehendlich deklariert!
    danke

    danke



  • Fachmann schrieb:

    in der entwicklungsphase mach ich dann aus einfachheitsgründen erstmal alles public damit ich schnell überall zugreifen kann)

    Machs gleich richtig, am Ende entwickelt man ne Handvoll Klassen parallel und braucht dann elend lang, das hinterher alles umzuändern - wenn mans nicht sogar links liegen lässt. In Multifunktionseditoren wie emacs und bestimmt auch in einigen IDEs kann man sich Makros schreiben, die zu einer privaten Variable die entsprechenden Getter und Setter automatisch generieren.


Anmelden zum Antworten