Pisałem już podobny wątek kiedyś, ale trochę w nim namieszałem, wiec postanowiłem utworzyć nowy.
Mam zadane definicje klas których nie mogę modyfikować, a muszę do nich napisać funkcje/metody operatorowe
#define ROZ 3
class Wektor
{
int t[ROZ]; // zmienic na prywatne !!!
public:
Wektor(); // wektor zlozony z samych zer
Wektor(int *d); // wektor wypelniony danymi z d
Wektor operator+(Wektor w); // zwraca sume wektorow
Wektor operator-(Wektor w); // zwraca roznice wektorow
int operator*(Wektor w); // iloczyn skalarny dwoch wektorow
Wektor operator*(int i); // iloczyn wektor * liczba
int operator[](int i); // zwraca t[i]
};
ostream & operator <<(ostream & str, Wektor w); // wypisuje wektor na ekranie
Wektor operator *(int i, Wektor w); // iloczyn liczba*wektor
class Macierz
{
public:
Wektor t[ROZ];
Macierz(); // macierz zerowa
Macierz(Wektor *w); // macierz zapelniona zadanymi wartosciami
Macierz operator+(Macierz m); // zwraca sume macierzy
Macierz operator-(Macierz m); // zwraca roznice macierzy
Wektor operator*(Wektor w); // zwraca macierz*wektor
Wektor &operator[](int i); // zwraca i-ty wektor macierzy
};
Macierz operator*(Macierz m1, Macierz m2); // mnozenie macierz*macierz
ostream & operator <<(ostream & str, Macierz m); // wypisuje macierz na ekranie
Na początku myślałem, że nie da się tego zadania zrobić z racji że pewne funkcje operatorowe są poza definicją klasy i nie ma dostępu do prywatnego składnika t[ROZ]
Teraz wiem, że mogę wykorzystać do tego operator[]
int Wektor::operator[](int i) // zwraca t[i]
{
return t[i];
}
Nie ma tutaj przypadku gdy wyjde poza zakres, ale póki co olać to.
Ekstra teraz mogę pobrać t[ROZ]! Czy to koniec problemów? No niestety.
Problem
operator ten nie zwraca referencji do wybranego elementu tablicy!
w związku z tym gdy definicje ciało poniższej metody operatorowej* (Jeżeli źle to określiłem, proszę mnie poprawić)*
Wymyśliłem, że uda mi się wybrnąć z tego ustawiając wskaźnik na dany element tablicy
Wektor Macierz::operator*(Wektor w) // zwraca macierz*wektor
{
Wektor wynik; // tworzymy pomocnicza Wektor
int *wsk;
for(int i=0; i<ROZ; i++)
for(int j=0; j<ROZ; j++)
{
// wynik.t[i] += this->t[j].t[i] * w.t[j]; // 1) Tak zrobilbym to gdyby skladnik t[ROZ} byl publiczny
// wynik[i] += (this->t[j])[i] * w[j]; // 2) Tak gdyby Wektor &operator[](int i); // zwracal Referencje do tego, co ma byc poddane podstawieniu
wsk = &wynik[i]; // 3) ustawiam wskaznik aby pokazywal na adres danej wspolrzednej wektora
*wsk = (this->t[j])[i];
}
return wynik;
}
Wektor & Macierz::operator[](int i) // zwraca i-ty wektor macierzy
{
return t[i];
}
Ale co mnie nie dziwi mam błąd dla tej linijki:
wsk = &wynik[i];
lvalue required as unary '&' operand|
Symfonia Grębosza:
Po lewej stronie może być:
- sam obiekt
- referencja
- obiekt pokazywany przez wskaznik
Jakieś pomysły jak poradzić sobie z tym problemem, wiadomości z książki na nic mi się tu nie zdały...
Facet lubi podchwytliwe zadania. Już sam fakt, ze musiałęm wykorzystać operator[] aby dołuskać się do t[ROZ], co tym razem mógł wymyślić
Z góry dziękuję za poświęcony czas i pomoc.
Pozdrawiam!