Przeładowanie operatorow: L-value

0

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!

1
&wynik[i]; 

wyrażenie wynik[i] to rvalue, czyli jedyne co możesz z tym zrobić, to nadać tę wartość innej zmiennej, a dopiero potem pobrać adres.(nie rób tego, bo w twoim wypadku nie będzie miało to sensu)

W funkcji nie pracuj na obiekcie klasy wektor, tylko na tablicy, a potem użyj tego konstruktora:

Wektor(int *d); // wektor wypelniony danymi z d

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