eine klasse als eigenschaft einer andren klasse definieren?



  • erstmal vorweg: ich bin erst seit ca nem halben jahr dabei c++ zu lernen und hab davor nur php gemacht.
    Falls das folgende problem ein alltägliches neulingsproblem sein sollte,welches man unter korrekter benutzung der suchfunktion ohne probleme hätte lösen können,entschuldige ich mich schonmal 😉
    (anmerkung: ich hab die suche benutzt, und nichts gefunden,falls es doch schon ein thread darüber geben sollte,einfach den link geben 🙂 )

    also, ich würde gerne eine klasse definieren, von der eine eigenschaft, eine andere klasse sein soll(also keine vererbung).

    ich habs auf folgendem wege probiert:

    class test{//experimentelle klasse
    private:
    //irgendwelche eigenschaften
    public:
    	 class Vector;
    };
    
    class Vector{
    private:
    		float x;//positionskoordinaten des objekts 
    		float y;//dem die klasse angehört
    		float z;
    public:
    	Vector(float x=0,float y=0,float z=0){//konstruktor
    		this->x=x;
    		this->y=y;
    		this->z=z;
    	}
    	float getx(){//funktionen um x,y,z zu erhalten
    		return this->x;
    	}
    	float gety(){
    		return this->y;
    	}
    	float getz(){
    		return this->z;
    	}
    	float entfernung(test &objekt){//berechnung der entfernung zwischen diesem objekt und einem andren
    		float entfernung;
    		float ox;//koordinaten des objekts
    		float oy;
    		float oz;
    		ox=objekt->Vector.getx();//zuweisung der koordinaten
    		oy=objekt->Vector.gety();
    		oz=objekt->Vector.getz();
    		ox=ox-this->x;//zur berechnung muss ein objekt
    		oy=oy-this->y;//auf den nullpunkt gebracht werden
    		oz=oz-this->z;//das andre wird dann nachgezogen
    		entfernung=sqrt(pow(ox)+pow(oy)+pow(oz));//berechnung der entfernung
    		return entfernung;
    	}
    
    };
    

    ich bekomm aber folgende fehlermeldung:
    type 'test' does not have an overloaded member 'operator ->'



  • Dein Objekt ist eine Referenz, kein Zeiger, greife daher mit . und nicht mit -> auf dieses zu.

    MfG MAV



  • ich find "->" aber viel übersichtlicher als ".", wie muss man den code ändern,damit ich "->" verwenden kann?



  • Diese Albernheit sein lassen und dein Übersichtlichkeitsempfinden ändern wär das einfachste.



  • Das ist eine Vordeklaration einer Klasse.

    public: 
         class Vector;
    

    Was du brauchst,soll ungefähr so aussehen:

    class test{//experimentelle klasse 
    private: 
    //irgendwelche eigenschaften 
    public:
         class Vector;
         Vector* vector; 
    //oder Vector vector; in dieser Situation reicht die obige Vordeklaration nicht.
    };
    
    object
    

    ist eine Referenz. Um eine Eingenshaft oder eine Methode einer Klasee zuzugreifen, verwendet man einen Punkt plus der Name der Eigenschaft. Opretator -> wird verwendet, wenn ein Zeiger vorhanden ist.
    Es gibt noch einen wichtigen Hinweis. Das ist ein sehr schlechter Stil, offentliche Eigenschaften in einer Klasse zu verwenden.



  • seufz...mit dem stil hast du wirklich recht...aber was soll man machen, wenn man die Vector klasse ausserhalb haben will..würd ich die klasse in den private teil stecken, hätt ich keinen zugriff mehr auf die funktionen getx/y/z anderer objekte die diese klasse enthalten.würde ich nun für jedes objekt welches die Vector klasse enthält eine abfrage auf die funktionen in der klasse machen, könnt ich gleich vererbung benutzen 😉

    die einzige möglichkeit die ich sehe das zu machen, ohne irgendwelche stilregeln zu verletzen, wäre eine struktur zu benutzen, die alles enthält...

    aber mal back to topic 😉
    ich hab eure tips beherzigt, und bekomme jetzt "Nurnoch" die fehler:
    left of '.getx' must have class/struct/union type
    left of '.gety' must have class/struct/union type
    left of '.getz' must have class/struct/union type



  • Der Vorteil von C++ ist, das es schnell sein kann ! :p

    Und geschwindigkeit hat ihren preis, in dem fall das esthetische empfinden deinerseits 😛 Galub mir aber man gewoehnt sich dran ...

    x-> ist eine andere schreibweise fuer (*x). also synthaktisch unterschiedlich.
    Versuch ned zeiger einzufuegen wo gar keine Brauchst, erst recht ned nur wegen der Form;

    float entfernung(test &objekt){//berechnung der entfernung zwischen diesem objekt und einem andren 
            float entfernung; 
            float ox;//koordinaten des objekts 
            float oy; 
            float oz; 
            ox=objekt->Vector.getx();//zuweisung der koordinaten 
            oy=objekt->Vector.gety(); 
            oz=objekt->Vector.getz(); 
            ox=ox-this->x;//zur berechnung muss ein objekt 
            oy=oy-this->y;//auf den nullpunkt gebracht werden 
            oz=oz-this->z;//das andre wird dann nachgezogen 
            entfernung=sqrt(pow(ox)+pow(oy)+pow(oz));//berechnung der entfernung 
            return entfernung; 
        }
    

    float entfernung(test &objekt) - aenderst du dein object (den parameter) in dieser methode ? nein ? also :
    float entfernung(const test &objekt), damit weiss nun der aufrufer, das sein object ned angetastet wird.
    Andert sich die member der instanz der Klasse, die die entfernung Methode zur verfuegung stellt bei aufruf der Entfernung methode ? nein ... dann:
    float entfernung(const test &objekt) const
    Nun kannst die entfernung auch an konstanten variablen ermitteln ...

    float entfernung;
    float ox;//koordinaten des objekts
    float oy;
    float oz;
    ox=objekt->Vector.getx();//zuweisung der koordinaten
    oy=objekt->Vector.gety();
    oz=objekt->Vector.getz();
    ox=ox-this->x;//zur berechnung muss ein objekt
    oy=oy-this->y;//auf den nullpunkt gebracht werden
    oz=oz-this->z;//das andre wird dann nachgezogen
    entfernung=sqrt(pow(ox)+pow(oy)+pow(oz));//berechnung der entfernung
    return entfernung;

    du legst, lass mich zaehlen ... 7 variablen + rueckgabeparameter aufn stack an, fuer Werte die schon von anderen klassen auf dem stack angelegt wurden, und wo garantiert ist, das sie existierensolange sie brauchst ... (durch die referenz)
    Also das ist verschwendung von resourcen ....

    float entfernung(const test &objekt)
    {
        //berechnung der entfernung zwischen diesem objekt und einem andren 
        return sqrt(pow(x-objekt.Vector.getx())+pow(y-objekt.Vector.gety())+(pow(z-objekt.Vector.getz()));
    }
    

    sieht zwar ned schoen aus, ist vielleicht auch ned richtig (weil noch verschrieber drin sind 😃 ) ist aber um laengen performanter.

    wobei ich ned verstehe, warum du das object mit reinbringst .... ohne dem gehts noch effektiver

    float entfernung(const Vector &rx)
    {
        //berechnung der entfernung zwischen diesem objekt und einem andren 
        return sqrt(pow(x-rx.x)+pow(y-rx.y())+(pow(z-rx.z()));
    }
    

    musst dann halt den aufruf aendern ....

    objekt obj1 obj2 
    
    float entfernung = obj1.vector.entfernung(obj2.vector);
    


  • So wäre es besser:
    #include "Vector Datei"

    class test{//experimentelle klasse 
    private: 
        Vector *vector;
    public:
        //
        test(float x=0,float y=0,float z=0)){vector = new Vector(x,y,z);}
        ~test(){delete vector;}
        //copy constructor and assignment operator einfuegen!!!
        const Vector getVector(){ return *vector}; 
    };
    
    ox=objekt.getVector().getx();//zuweisung der koordinaten 
    oy=objekt.getVector().gety(); 
    oz=objekt.getVector().getz();
    


  • float entfernung;
    float ox;//koordinaten des objekts
    float oy;
    float oz;
    ox=objekt->Vector.getx();//zuweisung der koordinaten
    oy=objekt->Vector.gety();
    oz=objekt->Vector.getz();
    ox=ox-this->x;//zur berechnung muss ein objekt
    oy=oy-this->y;//auf den nullpunkt gebracht werden
    oz=oz-this->z;//das andre wird dann nachgezogen
    entfernung=sqrt(pow(ox)+pow(oy)+pow(oz));//berechnung der entfernung
    return entfernung;

    du legst, lass mich zaehlen ... 7 variablen + rueckgabeparameter aufn stack an

    ich leg nur 3variablen+rückgabewert an :p

    float entfernung(const test &objekt)
    {
        //berechnung der entfernung zwischen diesem objekt und einem andren 
        return sqrt(pow(x-objekt.Vector.getx())+pow(y-objekt.Vector.gety())+(pow(z-objekt.Vector.getz()));
    }
    

    sieht zwar ned schoen aus, ist vielleicht auch ned richtig (weil noch verschrieber drin sind 😃 ) ist aber um laengen performanter.

    methematisch absolut falsch, aber die performance stimmt wirklich 😉

    wobei ich ned verstehe, warum du das object mit reinbringst .... ohne dem gehts noch effektiver

    stell dir mal vor, ich habe 2 objekte. das eine objekt heisst spieler1, das andre spieler2, wenn nun die vector classe in beiden spielern ihre positionsdaten+andre werte in dieser art wie im qc beschrieben speichern soll, dann brauch man das objekt.das ziel der sache war ja, mithilfe von Vector alles was mit positionierung zu tun hat aus dem qc der übersichtlichkeit halber auszuklammern 😉

    float entfernung(const Vector &rx)
    {
        //berechnung der entfernung zwischen diesem objekt und einem andren 
        return sqrt(pow(x-rx.x)+pow(y-rx.y())+(pow(z-rx.z()));
    }
    

    musst dann halt den aufruf aendern ....

    objekt obj1 obj2 
    
    float entfernung = obj1.vector.entfernung(obj2.vector);
    

    wenn du mir nur erklärst, was rx ist ;)//edit hat sich erledigt



  • ok ok ... 4 + rueckgabewert, weil float entfernung; ist nicht dein rueckgabewert, der wird schon beim aufreuf deiner funktion angelegt ...
    und bei oy=oy-this->y; ... willst ned wissen was der compiler tut:p vielleicht hast ja glueck und er optimiert es zu oy -=this->y;

    mit dem object reinbringen mein ich ... warum das in den funktionsaufruf bringen ?

    Objektorientiert gedacht, ist die reine entfernung zwischen den zwei vectoren ja ja ein problem der vectoren, und ned der ubergeordneten objecte

    also wenn dein vector so definiert ist ....

    class vector
    {
    // Ctoren und Dtoren hier
    // 
    float get_Distance(const vector & rx) const;
    }
    

    dann leitest alle deine Objecte von ner schnittstelle ab, die so alle graphischen Objecte deiner Spielwelt gemeinsam haben. Die schnittstelle sollte ne funktion haben, die dir die lage des mittelpunkt deines Object in deinem koordinatensystem beschreibt, und jedes Object sollte sowas haben ....
    also

    class IGameObject
    {
    public:
        const vector & getCenterPos() const = 0;
        // und noch alles andere, was die objecte so gemeinsam haben 
    
    }
    

    dann leitest deine Playerclasse ab .. und in der implementierst, die funktionen , dann kannst die entfernung einfach folgendermassen errechnen ...

    player spieler1, spieler2;
        // hier irgendwo in der gegend rumsaussen lassen ... 
        // nu entfernung bestimmen 
        float fdist = spieler1.getCenterPos().get_Distance(spieler2.getCenterPos());
    

    wenn dir das ned gefaellt, spendierst deiner Basisschnittstelle ( eher unschoen ) ebenfalls ne funktion get_Distance ...

    class IGameObject
    {
    public:
        const vector & getCenterPos() const = 0;
        // und noch alles andere, was die objecte so gemeinsam haben 
    
        // noch ne funktion zur ermittlung der Distance zweier Objecte 
        float get_Distance( const IGameObject & rx) { return this->getCenterPos().get_Distance(rx.getCenterPos());}; 
    }
    

    unschoen, weil ne schnittstellen deklaration keine funktionalitaet haben sollte, nen Object noch zwischenziehen waere vielleicht sauberer

    und die dist kannst nu so ermitteln :

    player spieler1, spieler2;
        // hier irgendwo in der gegend rumsaussen lassen ... 
        // nu entfernung bestimmen 
        float fdist = spieler1.get_Distance(spieler2);
    

    Nur so als anregung ...
    vielleicht noch ueberlegen, ob man die dist - funktion am vector ned als externe funktion bauen sollt ...

    ciao ...



  • werd mir das mal durch den kopf gehen lassen...
    eigentlich gings bei dem projekt hier nur um einen test, eine zentrale klasse für alle vector operationen aufbauen zu können, und den besten weg sie zu implementieren, nun bin ich halt was abgeschweift, und dies wars dann 😃

    aber eine frage noch: wieso gibt der mir in der zeile hier nen fehler:
    ox=objekt.Vector.getx();
    fehlermeldung:
    left of '.getx' must have class/struct/union type

    //edit ich merke immer mehr, dass der direkte umstig von php auf c++ der sprung ins eiskalte wasser war Oo

    ich frag lieber nich, was folgende zeilen bedeuten:
    const vector & getCenterPos()//vorallem das "&" bereitet mir kopfschmerzen
    float fdist = spieler1.getCenterPos().get_Distance(spieler2.getCenterPos());//wieso kann da nach getCenterPos()noch ein punkt mit ner weiteren funktion rein?


Anmelden zum Antworten