Przeciążanie operatorów

0

Witam,
Mam pewien problem z przeciążeniami operatorów m.in. operator+. Poniżej załączam kod:

//Dodawanie (wektor + wektor)
    Wektor& operator+ (Wektor &w){
      Wektor v(*this);
      if(checkDimensions(w) != 0) return;
      else{
        for(int i = 0; i < size; ++i){
          v[i]=(*this)[i]+w[i];
        }
      }
      return v;
    }

Oto co mi wywala g++ (kompiluje na linuxie):

mws.cpp: In member function ‘Wektor& Wektor::operator+(Wektor&)’:
mws.cpp:25:35: error: return-statement with no value, in function returning ‘Wektor&’
mws.cpp:24:15: warning: reference to local variable ‘v’ returned
mws.cpp: In function ‘int main()’:
mws.cpp:274:25: error: cannot convert ‘Wektor’ to ‘Wektor*’ in initialization

I jeszcze w razie czego:
a)w funkcji main():

  int tabVec1[5] = {1,2,3,4,5};
  int tabVec2[5] = {6,7,8,9,10};

  Wektor *vec1 = new Wektor(5,tabVec1);
  Wektor *vec2 = new Wektor(5,tabVec2);

  vec1->Vname='A';
  vec2->Vname='B';

  cout<<"Wektor1 + Wektor2"<<endl;
  Wektor *vec3 = *vec1+*vec2;

b)Konstruktor:

    //Konstruktor
    Wektor(int k=3, int *values=NULL){
      int *wektor = new int[k];

      if(values == NULL){
	for(int i = 0; i < k; i++){
	  wektor[i] = 0;
	}
      }
      else{
	for(int i = 0; i < k; i++){
	  wektor[i] = values[i];
	}
      }
      size = k;
      vectorAddr = wektor;
    }

Czy ktoś mógłby mi wytłumaczyć te przeciążania i zwracanie wskaźników?

Szukałem w necie podobne materiały i się zdziwiłem, że dla operator+() przekazują 2 argumenty, a nie jeden co u mniew g++ jest nie dozwolone! Czy w środowisku kompilatorów rzeczywiście istnieją takie rozbieżności?!

0
Wektor& operator+ (Wektor &w){
      Wektor v(*this); // po co Ci to?
      if(checkDimensions(w) != 0) return;
      else{
        for(int i = 0; i < size; ++i){
          v[i]=(*this)[i]+w[i];
        }
      }
      return v;
    }
Wektor& operator+ (Wektor &w){
      if(checkDimensions(w) != 0) return;
      else{
        for(int i = 0; i < size; ++i){
          w[i]=(*this)[i]+w[i];
        }
      }
      return w;
    }

A co do dwóch argumentów przy przeciążaniu. Jeśli chcesz przeciążyć np. operator >>, aby działał dla cin >> coś, a nie tylko Wektor >> cos, musisz zrobić tak:

istream& operator>>(istream & wejscie, Wektor & w);
0

Masz racje. Mialem cos podobnego, ale facet nam cos mowil, zeby tworzyc dynamicznie za pomoca operatora new i zwracac wskaznik do tego nowego obiektu, szczegolnie przy mnozeniu bedzie to potrzebne. Wlasnie to musze zrobic i niby proste, a nie wychodzi.

0

No to w takim wypadku musisz utworzyć konstruktor kopiujący, ponieważ przy tamtym zapisie kompilator nie wiedział co ma sobie z tym *this zrobić.

0

@Blood: nie wiem czy mi się wydaje, ale ten operator + nie do końca zrobi to co powinien - zmieniasz r-wartość.

Ten operator powinien zwracać raczej wartość, a nie referencję, czyli miałeś prawie dobrze(zakładam, że masz tam konstruktor kopiujący).

Co do tej ilości argumentów to sprawa jest prosta: operator możesz przeładować funkcją globalną lub składową jakiejś klasy. Operator + jest dwuargumentowy(tzn. ma l i r-wartość). Teraz jeżeli przeciążasz go jako funkcję globalną to podajesz 2 argumenty, jeżeli jest składową klasy to też, ale l-wartość jest domyślnie obiektem klasy na rzecz, której ten operator będzie wywoływany.

0

Już powoli zaczynam coś w tym rozumieć, ale jeszcze nie wychodzi
Jeżeli wykonuje dodawanie tak: (*vec1)+(*vec2), to w jaki sposob trzeba pobrać wskaźnik?
Bo jak miałem:
Wektor *vec3 = &((*vec1)+(*vec2));
To kompiluje się bez problemów, tylko dziwne liczby wyskakują - np. zamiast rozmiaru 5 jest 7 i liczby typu [96 0 13 0 6304112 0 96]
I mi się wydaje, że jest źle bo jakby pobiera adres adresu?

0

Znalazlem błąd w przypisaniu v[i]=(*this)[i]+w[i]; jak wyswietlam tą druga część po znaku = to są dobre wartości, ale jak przypisze, to wychodzi w v nie to co trzeba.

0

A co do dwóch argumentów przy przeciążaniu. Jeśli chcesz przeciążyć np. operator >>, aby działał dla cin >> coś, a nie tylko Wektor >> cos, musisz zrobić tak:

istream& operator>>(istream & wejscie, Wektor & w);
</quote>

Czyli jak mam operator* i musze w klasie napisac czesc obslugujaca mnozenie wektormacierz oraz wektorwektor to pisze:

Wektor* operator*(Wektor w, Macierz m){...}

i w jaki sposob to wywolac dla poszczegolnego mnozenia? Czy moze trzeba oddzielnie napisac dwie funkcje operator* rozniace sie argumentami?

0

Juz udalo mi sie rozwiazac powyzszy problem - to bylo tak, ze jedna klasa byla wczesniej napisana i nie widziala drugiej, dlatego byl blad declaration operator* of non-function.
Dziekuje wszystkim za pomoc, bardzo mi pomogliscie :)

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