C++, przeładowanie operatorów

0

Potrzebuje pomocy;/ siedzę już nad tym trzy dni, kopie w google i nic nie mogę znaleźć;/ mam do napisania przeładowanie operatorów dla klasy o nazwie wektor2d. Mam utworzyć operatory do takich działań:

1.[int][wektor2d]
2.[float]
[wektor2d]
3.[wektor2d][wektor2d]
4.[wektor2d]
[int]
5.[wektor2d]*[float]
6.[wektor2d][wekor2d] gdzie oznacza iloczyn skalarny
7.[wektor2d]-[wektor2d]

dla 3-ki i 7-ki potrafiłem przeciążyć operatory, ale dla reszty nie potrafię;/ jeśli ktoś potrafi pomóc to będę wdzięczny. Kiedy próbuje robić mnożenie stałej całkowitej przez wektor to mi błąd typów wyskakuje, dlaczego??;/ dlaczego także kiedy chce wprowadzić zmienną iteracyjną (i) i przypisze do niej int to tez mi wywala błąd?? dla mnie jest to bzdurą;/ Mogę także prosić o zrozumiały opis do tych kodów??;/

[CODE]
#include <cstdlib>
#include <iostream>

using namespace std;

class wektor2d

{
float x,y,w,z;
int s;
public:
friend ostream &operator<<(ostream &ost, wektor2d &wek);

      wektor2d &operator*(wektor2d &wek)
      {
               return *(new wektor2d(x*wek.x, y*wek.y));
               }
      
      
      wektor2d operator=(wektor2d &wek)
      {
       x=wek.x;
       y=wek.y;
       }
      
      
      wektor2d &operator-(wektor2d wek)
      {
          return *(new wektor2d(x-wek.x, y-wek.y));
          
      }     
      
      
      wektor2d &operator+(wektor2d wek)
      {
           return *(new wektor2d(x+wek.x, y+wek.y));

     

     /* wektor2d operator^(wektor2d wek)  //iloczyn skalarny
      {
              w=0;
              for (int i=1;i<=2;i++)
              {w+=wek.x[i]*wek.y[i];}
              return w;
              }*/
  
     
     wektor2d(float xx,float yy)
     { 
                    x=xx;
                    y=yy;
     }
   
     void wypisz()
     {
        cout<<x<<" "<<y;
     }

     
     wektor2d()
     {
               x=0;
               y=0;
     }

};

ostream &operator<<(ostream &ost, wektor2d &wek)
{
ost<<"["<<wek.x<<","<<wek.y<<"]";
return ost;
}

 int main(int argc, char *argv[])
 
   {
        wektor2d c(0,0);
        wektor2d v(7,11);        
        wektor2d w(8,10);
        wektor2d d(2);
        cout<<"Wypisuje podane wektory:\n";
        cout<<"Wektor v: "<<"[";
        v.wypisz();
        cout<<"]\n"<<"Wektor w: [";
        w.wypisz();
        cout<<"]\n\n\n";
        cout<<"Podany wektor jest suma v+v: ";
        c=v+v;
        cout<<c<<"\n";
        cout<<"\nPodany wektor jest roznica v-w: ";
        c=v-w;
        cout<<c<<"\n";
        cout<<"\nMnozenie wektorow przed stala liczbe w*2: ";
        c=w*d;
        cout<<c<<"\n";
        cout<<"\nMnozenie wektorow przed stala liczbe v*2: ";
        c=v*d;
        cout<<c<<"\n";
        cout<<"\nMnozenie wektorow przed stala liczbe 2*w: ";
        c=d*w;
        cout<<c<<"\n";
        cout<<"\nMnozenie wektorow przed stala liczbe 2*v: ";
        c=d*v;
        cout<<c<<"\n";
        cout<<"\nmnozenie v*w: ";
        c=w*v;
        cout<<c<<"\n";
        cout<<"\n";
        
        
        
        
system("PAUSE");
return EXIT_SUCCESS;

}
[/CODE]

0

Poprawiłem Twój kod - tylko poprawiłem, nie zrobiłem mnożenia sklarnego
W jednym zapomniałeś nawiasu klamrowego }.

#include <cstdlib>
#include <iostream>


using namespace std;
 
class wektor2d

{
      float x,y,w,z;
      int s;  
   public:
          friend ostream &operator<<(ostream &ost, wektor2d &wek);
         
          wektor2d &operator*(wektor2d &wek)
          {
                   return *(new wektor2d(x*wek.x, y*wek.y));
                   }
         
         
          wektor2d operator=(wektor2d &wek)
          {
           x=wek.x;
           y=wek.y;
           }
         
         
          wektor2d &operator-(wektor2d wek)
          {
              return *(new wektor2d(x-wek.x, y-wek.y));
             
          }    
         
         
          wektor2d &operator+(wektor2d wek)
          {
               return *(new wektor2d(x+wek.x, y+wek.y));
          }
         
/*
          wektor2d operator^(wektor2d wek)  //iloczyn skalarny
          {
                  w=0;
                  for (int i=1;i<=2;i++)
                  {w+=wek.x[i]*wek.y[i];}
                  return w;
                  }
     
         */
         wektor2d(float xx,float yy=0) //zobacz 1
         {
                        x=xx;
                        y=yy;
         }
       
         void wypisz()
         {
            cout<<x<<" "<<y;
         }

         
         wektor2d()
         {
                   x=0;
                   y=0;
         }
 
 };
 
       
 ostream &operator<<(ostream &ost, wektor2d &wek)
      {
                         ost<<"["<<wek.x<<","<<wek.y<<"]";
                         return ost;
                         }
 

     int main(int argc, char *argv[])
     
       {
            wektor2d c(0,0);
            wektor2d v(7,11);        
            wektor2d w(8,10);
            wektor2d d(2); //zobacz 2
            cout<<"Wypisuje podane wektory:\n";
            cout<<"Wektor v: "<<"[";
            v.wypisz();
            cout<<"]\n"<<"Wektor w: [";
            w.wypisz();
            cout<<"]\n\n\n";
            cout<<"Podany wektor jest suma v+v: ";
            c=v+v;
            cout<<c<<"\n";
            cout<<"\nPodany wektor jest roznica v-w: ";
            c=v-w;
            cout<<c<<"\n";
            cout<<"\nMnozenie wektorow przed stala liczbe w*2: ";
            c=w*d;
            cout<<c<<"\n";
            cout<<"\nMnozenie wektorow przed stala liczbe v*2: ";
            c=v*d;
            cout<<c<<"\n";
            cout<<"\nMnozenie wektorow przed stala liczbe 2*w: ";
            c=d*w;
            cout<<c<<"\n";
            cout<<"\nMnozenie wektorow przed stala liczbe 2*v: ";
            c=d*v;
            cout<<c<<"\n";
            cout<<"\nmnozenie v*w: ";
            c=w*v;
            cout<<c<<"\n";
            cout<<"\n";
           
           
           
           
    system("PAUSE");
    return EXIT_SUCCESS;
} 

Jeszcze taka jedna sprawa - w miejscach zobacz 1 i zobacz 2 (oznaczyłem jako komentarze), nie zgadzały się parametry do konstruktora. Zakładam, że chodziło Tobie o domyślną wartość (0). Wtedy jednak mnożenie nie bardzo wychodzi, ponieważ drugą wartością wektora jest 0, więc wynikiem tez będzie 0. Jeśli chcesz mnożyć przez stałą liczbową, lepiej jest stworzyć do tego funkcję:

0

a potrafilbys zrobic iloczyn skalarny?? troche juz zrobilem, brakuje mi tylko trzech rzeczy:

[int][wektor2d]
[float]
[wektor2d]
[wektor2d]^[wektor2d] iloczyn skalarny

czy ktos potrafilby pomoc??;/

0

Mnożenie nie powinno być trudne. Jeśli chcesz, żeby pierwszym argumentem była liczba int/float to musisz uczynić funkcję globalną(zewnętrzną) i uczynić ją przyjacielem klasy.

wektor2d &operator*(int ile, wektor2d &wekt)
{
       return *(new wektor2d(ile*wekt.x, wekt.y));
}

Tak samo dla float

0
Fuv napisał(a)

Mnożenie nie powinno być trudne. Jeśli chcesz, żeby pierwszym argumentem była liczba int/float to musisz uczynić funkcję globalną(zewnętrzną) i uczynić ją przyjacielem klasy.

wektor2d &operator*(int ile, wektor2d &wekt)
{
       return *(new wektor2d(ile*wekt.x, wekt.y));
}

Tak samo dla float

dzieki bardzo!!!:) tyllko pytanie, dlaczego tak jest?? dlaczego musialem zrobic fukcje zaprzyjaźnioną??
a potrafilbyś pomóc z iloczynem skalarnym??

0

Więc tak:
chciałeś zaimplementować mnożenie wektora przez stałą. Teraz możesz pomnożyć go "na dwa sposoby": staławektor albo wektorstała - jak wiadomo mnożenie jest przemienne. Dla kolejnych przypadków:

  1. Wektor * Stała - Tutaj można napisać to na dwa sposoby, jako funkcję składową lub globalną. Jako funkcję globalną można zawsze, więc zastanówmy się, dlaczego można jako funkcję składową. Ano dlatego, że funkcja składowa jako pierwszy argument przyjmuje własny obiekt(tutaj wektor2d). Jako drugi będzie liczba. Jak napiszesz w klasie deklarację:
wektor2d &operator*(int liczba);

To mimo tego, że w nawiasie podany jest jeden argument, to w domyśle mamy drugi(wektor2d) na rzecz którego wywoływana jest funkcja. ALE tylko jeśli taką deklarację podałeś wewnątrz klasy!

2)Stała * Wektor: Tutaj pierwszym argumentem jest liczba int/float, więc od razu możemy zauważyć, że nie pasuje nam funkcja składowa - ta musiałaby mieć jako pierwszy argument wektor2d. Więc odpada. Zostaje nam więc funkcja globalna. Dlaczego musi być zaprzyjaźniona? Ano dlatego, że korzysta ona z prywatnych składników klasy wektor2d(x oraz y). Gdy nie uczynisz jej jej przyjacielem to kompilator wyrzuci błąd, że składniki do jakich chcesz się odwołać, x i y, są prywatne. Masz jeszcze wyjście aby uczynić je publicznymi, lecz to odradzam. To co nie jest potrzebne jako publiczne niech nim nie będzie.

à propos iloczynu skalarnego - rozumiem, że masz na myśli długość jednego wektora razy długość drugiego razy cosinus kąta między nimi?

0
Fuv napisał(a)

Więc tak:
chciałeś zaimplementować mnożenie wektora przez stałą. Teraz możesz pomnożyć go "na dwa sposoby": staławektor albo wektorstała - jak wiadomo mnożenie jest przemienne. Dla kolejnych przypadków:

  1. Wektor * Stała - Tutaj można napisać to na dwa sposoby, jako funkcję składową lub globalną. Jako funkcję globalną można zawsze, więc zastanówmy się, dlaczego można jako funkcję składową. Ano dlatego, że funkcja składowa jako pierwszy argument przyjmuje własny obiekt(tutaj wektor2d). Jako drugi będzie liczba. Jak napiszesz w klasie deklarację:
wektor2d &operator*(int liczba);

To mimo tego, że w nawiasie podany jest jeden argument, to w domyśle mamy drugi(wektor2d) na rzecz którego wywoływana jest funkcja. ALE tylko jeśli taką deklarację podałeś wewnątrz klasy!

2)Stała * Wektor: Tutaj pierwszym argumentem jest liczba int/float, więc od razu możemy zauważyć, że nie pasuje nam funkcja składowa - ta musiałaby mieć jako pierwszy argument wektor2d. Więc odpada. Zostaje nam więc funkcja globalna. Dlaczego musi być zaprzyjaźniona? Ano dlatego, że korzysta ona z prywatnych składników klasy wektor2d(x oraz y). Gdy nie uczynisz jej jej przyjacielem to kompilator wyrzuci błąd, że składniki do jakich chcesz się odwołać, x i y, są prywatne. Masz jeszcze wyjście aby uczynić je publicznymi, lecz to odradzam. To co nie jest potrzebne jako publiczne niech nim nie będzie.

à propos iloczynu skalarnego - rozumiem, że masz na myśli długość jednego wektora razy długość drugiego razy cosinus kąta między nimi?

dzieki za wytlumaczenie:) Jesli chodzi o iloczyn skalarny znalazlem na google taka fajna petle: s=0;
for (int i=0;i<=1;i++)
{s+=x[i]*y[i];}
return s;
jest to suma iloczynu poszczegolnych skladnikow. Ale nie wiem jak to zrobic

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