Skocz do zawartości

Operatory


Doc

Recommended Posts

Problem jest z podstaw programowania ale jest. Chciałem napisac klase CVector następującej treści:

class CVector {
   float x;
   float y;
   float z;

   CVector operator*( float r )
   {
       x*=r;
       y*=r;
       z*=r;
       return (*this);
    }

   CVector operator*( float r, CVector& a ) // tu wywala bland
   {
       return (a*r);
   }

};

oczywiście to nie cala klasa. Chodzi o to że przy zaznaczonym fragmencie wywala mi VC6 bland deklaracji, a mianowicie że ten operator musi zostać zadeklarowany jednoargumentowo. Patrzyłem w książkach i nawet w bibliotekach samego VC6 i jest to tam zadeklarowane podobnie tylko że operator '+' ( u mnie tez nie dziala ), i te operatory deklarowane w innych bibliotekach dzialaja. Może coś żle robie ( a jak znam siebie to pewnie tak ). Może ktoś wie co jest nie tak???
Za uwagi z góry thenx.

P.S: Sprawdzalem w forum nie ma takiego tematu :/

Link do komentarza
Udostępnij na innych stronach

Witam.

Operacja mnozenia jest operacja dwuargumentowa.Jesli przeladowujemy
operator dwuargumentowy to funkcja przeladowujaca(operator):

-musi miec dwa argumenty jesli jest zadeklarowana globalnie.

-musi miec jeden argument jezeli jest zadeklarowana jako funkcja skladowa klasy(drugim argument bedzie niejawnie przekazywany przez wskaznik this do obiektu tej klasy).Jednym z argumentow zawsze musi byc obiekt tej klasy na rzecz ktorego funkcja przeladowujaca jest wywolywana.

Deklaracja funkcji zaprzyjaznionej jest bez sensu,bo po co klasa ma deklarowac swoja wlasna funkcje skladowa(ma ona juz dostep do wszelkich skladnikow) jako zaprzyjazniona.

Pozdrawiam

Link do komentarza
Udostępnij na innych stronach

Marcin napisał:
ja mowilem o funkcji skladowej klasy(tu przyjazn ze swoja klasa jest bez sensu)

A jak inaczej chcesz to zrobić, aby funkcja ta znajdywała się w klasie i nie była zaprzyjaźniona?

Ja tylko napisalem,ze przeciez funkcja skladowa ma z definicji dostep do wszelkich skladnikow swojej klasy.Wiec po co deklarowac przyjazn klasy ze swoja funkcja skladowa.Moznaby powiedziec ze ona jest z definicji zaprzyjazniona ze swoja klasa.

Odpowiedz na pytanie: Nie chce tego zrobic, bo nie da sie tego zrobic.

Przyklad

#include<iostream>
#include<conio.h>
//---------------------------------------------------------------------------
class CVector {
     float x;
     float y;
     float z;
   public:
     CVector(float a=0,float b=0,float c=0) :x(a) , y(b) , z(c)  //konstruktor
       {
       }
     CVector operator*( float r )
       {
         x*=r;
         y*=r;
         z*=r;
         return (*this);
       }

     //friend CVector CVector::operator*( float r ); //czy opuscimy tę linie                                                                           //czy nie bez róznicy
                              //i tak funkcja ma dostep do skladowych prywatnych
     wypisz()
       {
        std::cout<<"x="<<x<<"\n"<<"y="<<y<<"\n"<<"z="<<z;
        getch();
       }


};
//---------------------------------------------------------------------------
int main()
{
  CVector wek(1,1,1) ,
          wek2       ;
  wek2=wek*4;
  wek2.wypisz();
        return 0;
}
//---------------------------------------------------------------------------

Pozdrawiam

Link do komentarza
Udostępnij na innych stronach

Zgadzam sie ale nie można zrobić funkcji składowej żeby możliwe było działanie nie takie

CVector v;
//
// tu inne rzeczy
//
CVector v1 = v*12.0f;

ale takie

CVector v;
//
//tu inne rzeczy
//
CVector v1 = 12.0f*v; // tu błąd wywali

bo funkcja składowa przyjmuje parametry poprzez this i zmienną float.
Wtedy trzeba zaprzyjaźniać. A jak sie napisze friend w ciele klasy to to nie będzie funkcja składowa tylko normalna jeżeli sie nie myle( ale moge sie mylic).
Taki jest moje skromne zdanie.

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...