Objektovo orientované vektory v C++

Sekcia: Programovanie 21.06.2010 | 03:16
Avatar slazer   Používateľ
Zdravím,
potreboval by som naprogramovať nejakú funkciu/konštruktor k hlavičkovému súboru vektoris.h (nie moja tvorba) dole aby bolo možné už deklarované a definované vektory re-inicializovať.Je to vôbec možné? Napr.

Vector3D vek(1,2,3); //toto je OK, funguje to cez konštruktory
vek(2,4,3); //toto potrebujem nejak naprogramovať. cieľom je aby hodnoty 1 2 3 v už existujúcom vektore vek boli zmenené na 2 4 3

#ifndef _VECTOR

#define _VECTOR

#include <math.h>



class Vector3D

{

private:

double x, y, z;

public:

//default constructor

Vector3D(double X , double Y , double Z )

{

x = X;

y = Y;

z = Z;

}



~Vector3D(){};



//calculate and return the magnitude of this vector

double GetMagnitude()

{

return sqrtf(x * x + y * y + z * z);

}



//multiply this vector by a scalar

Vector3D operator*(double num) const

{

return Vector3D(x * num, y * num, z * num);

}



//pass in a vector, pass in a scalar, return the product

friend Vector3D operator*(double num, Vector3D const &vec)

{

return Vector3D(vec.x * num, vec.y * num, vec.z * num);

}



//add two vectors

Vector3D operator+(const Vector3D &vec) const

{

return Vector3D(x + vec.x, y + vec.y, z + vec.z);

}



//subtract two vectors

Vector3D operator-(const Vector3D &vec) const

{

return Vector3D(x - vec.x, y - vec.y, z - vec.z);

}



//normalize this vector

void normalizeVector3D()

{

double magnitude = sqrtf(x * x + y * y + z * z);

x /= magnitude;

y /= magnitude;

z /= magnitude;

}



//calculate and return dot product

double dotVector3D(const Vector3D &vec) const

{

return x * vec.x + y * vec.y + z * vec.z;

}



//calculate and return cross product

Vector3D crossVector3D(const Vector3D &vec) const

{

return Vector3D(y * vec.z - z * vec.y,

z * vec.x - x * vec.z,

x * vec.y - y * vec.x);

}



void setX(double);

void setY(double);

void setZ(double);



double getX();

double getY();

double getZ();

};







#endif

    • Re: Objektovo orientované vektory v C++ 21.06.2010 | 11:08
      Avatar Fridolín Pokorný Fedora 21  Používateľ
      Mozes menit zdrojovy kod hlavickoveho suboru?
      Ak som spravne pochopil, tak chces v uz vytvorenom objekte zmenit private double x, y, z; podla parametrov predavanym funkcii vek().
      • Re: Objektovo orientované vektory v C++ 21.06.2010 | 13:59
        slazer   Návštevník
        Lenže vek nie je funkcia, ale inštancia typu Vector3D. Toto volanie mi nefunguje, lebo tam nemám potrebnú funkciu naprogramovanú a neviem ako ju naprogramovať (mám tam konštruktor, ale ten mu nestačí):

        vek(4,5,6);

        Cieľom je zmeniť súradnice toho vektora vek, ktorý som predtým vytvoril pomocou.

        Vector3D vek;
        • Re: Objektovo orientované vektory v C++ 21.06.2010 | 14:07
          Avatar Fridolín Pokorný Fedora 21  Používateľ
          Tak sprav triedu, ktora dedi po Vektor3D a v nej dopis funkciu, ktora ti zmeni x,y,z podla parametrov. Ak chces zmenit tento subor, tak si dopis verejnu funkciu s ktorou budes menit zapuzdrene premenne.
          • Re: Objektovo orientované vektory v C++ 21.06.2010 | 14:11
            Slazer   Návštevník
            Uz som to vyriesil troska inak (dole), ale dik.
    • Re: Objektovo orientované vektory v C++ 21.06.2010 | 11:33
      Avatar borg Arch, Debian jessie  Administrátor
      mozes si odvodit novu triedu od Vector3D a dorobit co potrebujes. nemusis hned menit hl. subor.
      • Re: Objektovo orientované vektory v C++ 21.06.2010 | 13:54
        Slazer   Návštevník
        Ano, hlavickovy subor mozem menit.
        • Re: Objektovo orientované vektory v C++ 21.06.2010 | 14:10
          Slazer   Návštevník
          Vyriešené. Nakoniec stačilo len preťažiť ternarny operator().

          void MyClass::operator()(int a, int b, int c)
          {
          this.x = a;
          this.y = b;
          this.z = c;
          }

          Namiesto this.x, this.y, this.z som však musel použiť x,y,z (zvláštne). Už to však fachčí.
          • Re: Objektovo orientované vektory v C++ 27.06.2010 | 16:34
            Avatar usamec   Používateľ
            ano this.x ti "urcite zafunguje", ked this je typu MyClass*

            a vobec pretazovat operator() je dobra kravina, ked si mozes radsej napisat funkciu changeValues a potom volat

            xy.changeValues(5,7,8);
            miesto
            xy(5,7,8);

            tak bude aspon kazdemu jasne, co ten kod ma robit