przeciazenie operatora

0

Mam do zrobienia iloczyn skalarny wybranych przez siebie wektorów w klasie. Do tego muszę przeciążyć operator *. Tylko nie wiem czy błąd jest przy funkcji czy deklaracji przeciazenia. RObię to po raz pierwszy więc nie wiem jak się z tym obchodzić zbytnio.

 
#include<iostream>
    #include <math.h>
    using namespace std;
    class Wektor
    {
            private:
                    int liczba;
                    int *poczatek;
            public:
                    Wektor(int n);
                    void Wpisz();
                    void Wypisz();
                    double Dlugosc();
                    void DodajWekt(Wektor b);
                    void Mnoz();
		    double skalarny(Wektor a,Wektor b);
                    void operator+=(Wektor b);
		    void operator*(Wektor b);
                    void operator=(Wektor b);
    };
    Wektor::Wektor(int n)
    {
            poczatek = new int[liczba = n];
            for(int i=0;i<n;i++)
            {
                    poczatek[i]= 0;
            }
    }
    void Wektor::Wpisz()
    {
            cout<<"wpisz elementy do wektora"<<endl;
            for(int i=0;i<liczba;i++)
            {
                    cin>>poczatek[i];
            }
    }
    void Wektor::Wypisz()
    {
            cout<<"Elementy wektora"<<endl;
            for(int i=0;i<liczba;i++)
            {
                    cout<<poczatek[i]<<endl;
            }
    }
   
    double Wektor::Dlugosc()
    {
            double kwadrat=0;
            double suma=0;
            double dlugosc=0;
            for(int i=0;i<liczba;i++)
            {
                    kwadrat=poczatek[i]*poczatek[i];
                    suma=suma+kwadrat;
            }
            dlugosc=sqrt(suma);
            cout<<"Dlugosc wektora to= "<<dlugosc;
			return dlugosc;
    }
    void Wektor::DodajWekt(Wektor b)
    {
            for(int i=0;i<liczba;i++)
            {
                    poczatek[i]=poczatek[i]+b.poczatek[i];
            }
    }
    void Wektor::Mnoz()
    {
            int a;
			cout<<"Przez ile pomnozyc?= "<<endl;
            cin>>a;
            for(int i=0;i<liczba;i++)
            {
                    poczatek[i]=poczatek[i]*a;
            }
    }
    double Wektor::skalarny(Wektor a,Wektor b)
	{
		double alfa, iloczynsk, licznik=0, mianownik=0,pom=0,raz,dwa;
		for(int i=0; i<liczba;i++)
		{
			licznik=poczatek[i]*b.poczatek[i];
			licznik+=pom;
		}
		raz=a.Dlugosc();
		dwa=b.Dlugosc();
		for(int i=0; i<2;i++)
		{
			mianownik=raz+dwa;
		}
		alfa=acos(licznik/mianownik);
		iloczynsk=a.Dlugosc()*b.Dlugosc()*alfa;
		return iloczynsk;

	}
    void Wektor::operator+=(Wektor b)
    {
            for(int i=0;i<liczba;i++)
            {
                    poczatek[i]=poczatek[i]+b.poczatek[i];
            }
    }
	void Wektor::operator*(Wektor b)
	{
		double pom=0, licznik=0;
		for(int i=0; i<liczba;i++)
		{
			licznik=poczatek[i]*b.poczatek[i];
			licznik+=pom;
		}
	}
    void Wektor::operator=(Wektor b)
    {
            if(this ==&b)
            cout<<"Nie mozna przypisac sobie tego samego obiektu"<<endl;
            else
                    delete[] poczatek;
            poczatek = new int[liczba=b.liczba];
            for(int i=0;i<liczba;i++)
            {
                    poczatek[i]=b.poczatek[i];
            }
    }
    int main()
    {
            int x, y,z=0;
			
			
			
            cout <<"Ilu elementowa ma byc tablica?"<<endl;
            cin>>x;
	    Wektor jeden(x);
	    cout <<"wpisz elementy pierwszego wektora"<<endl;
            jeden.Wpisz();
	    cout <<"Ilu elementowa ma byc tablica?"<<endl;
            cin>>y;
	    Wektor dwa(y);
	    cout <<"wpisz elementy drugiego wektora"<<endl;
            dwa.Wpisz();
	    Wektor trzy(z);
	    jeden*dwa;
	    trzy.skalarny(jeden,dwa);
            system("pause");
            return 0;
    }
0

Operator mnożenia powinien wyglądać tak:

Wektor operator*(const Wektor &b) const { ... }

i powinien zwracać nowy obiekt, który jest iloczynem. Generalnie nie powinien zmieniać stanu obiektu. Twój to robi, zachowuje się jak operator *=.

Podobnie z przypisaniem. Tak powinien wyglądać:

Wector& operator=(const Wektor &b)
{
    ...
    return *this;
}

dzięki temu będziesz mógł robić takie wiązanki:

w1 = w2 = w3 = w4 * w5;

Argumenty typu klasowego przekazuj przez const referencję (patrz wyżej). W klasie brakuje destruktora i konstruktora kopiującego.

0

Jaki błąd???? Dodatkowo dodaj destruktor, konstruktor kopiujący i operator przypisania, jak już używasz new (lub użyj std::vector<int>).

1 użytkowników online, w tym zalogowanych: 0, gości: 1