Doc Napisano Marzec 31, 2019 Autor Zgłoś Udostępnij Napisano Marzec 31, 2019 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 :/ Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Aberration Napisano Kwiecień 3, 2019 Zgłoś Udostępnij Napisano Kwiecień 3, 2019 jeśli się nie mylę to musisz zmienić błędną linijkę na: friend CVector operator*( float r, CVector& a ) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Storm Napisano Kwiecień 6, 2019 Zgłoś Udostępnij Napisano Kwiecień 6, 2019 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Doc Napisano Kwiecień 7, 2019 Autor Zgłoś Udostępnij Napisano Kwiecień 7, 2019 Dzieki za odpowiedz. Macie racje trzeba albo jeden argument albo zaprzyjaźnic albo globalną. A zaprzyjaźnianie nie jest bez sensu bo funkcja globalna nie ma dostepu do pul niepublicznych klasy. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Storm Napisano Kwiecień 8, 2019 Zgłoś Udostępnij Napisano Kwiecień 8, 2019 Co do przyjazni funkcji globalnej z klasa masz racje,ale ja mowilem o funkcji skladowej klasy(tu przyjazn ze swoja klasa jest bez sensu). Pozdrawiam Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Aberration Napisano Kwiecień 8, 2019 Zgłoś Udostępnij Napisano Kwiecień 8, 2019 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? Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Storm Napisano Kwiecień 9, 2019 Zgłoś Udostępnij Napisano Kwiecień 9, 2019 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Doc Napisano Kwiecień 14, 2019 Autor Zgłoś Udostępnij Napisano Kwiecień 14, 2019 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Storm Napisano Kwiecień 15, 2019 Zgłoś Udostępnij Napisano Kwiecień 15, 2019 Masz racje! Jezeli przez operator zakresu(::)nie okreslimy inaczej to przyjazn bedzie dotyczyc funkcji zdefiniowanej globalnie. Pozdrawiam Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.