Przeciazenie operatora =

0

Od razu mowie ze szukalem, ale nie moglem znalezc odpowiedzi na moj problem.

Mam sobie jaka klase

class Matrix
{
private:
int wyznacznik;
...
public:
int & operator=(const Matrix & st);
};

Czy jest w ogóle mozliwe przypisanie do inta jakiejs skladowej z klasy przez operator= ?

Z tego co czytalem operator= powiniene zwracac *this a ja chcialbym zeby zwrocil(przypisal) st.wyznacznik. Zapewne potrzebne bedzie jakies rzutowanie.
Chcialbym aby mozliwe bylo wywolanie czegos takiego, jesli to w ogole mozliwe.

Matrix x;
int wyznacznik;
wyznacznik=x;

Jest w ogóle mozliwe takie przeciazenie? Mamy tutaj niezgodnosc typow, wiec nie wiem juz sam.

0

Jest możliwe takie przeciążenie, ale musisz to zrobić na zewnątrz i podać jako pierwszy parametr int.

Dodatkowo warto wspomnieć, że typem zwracanym może tu być na przykład void. To, że zwracasz tu int pozwala na przykład na zapis:
</del>

Całkowicie się pomyliłem :x

0

No niestety przy probie przeciazenia w taki sposob kompilator zglasza ze operator rownosci musi przyjmowac tylko 1 argument.

1

:-o

Operator przypisania musi być funkcją składową klasy. Nie można go definiować tak, jakby chciał to zrobić Atael.

To co chcesz zrobić osiągniesz za pomocą przeciążenia operatora konwersji. (Również musi to być funkcja składowa)

operator int() const;
0

To ze musza to byc metody klasy, to ja wiem ;) W koncu te przeciazenia beda wywolywane na rzecz mojej klasy. Sprobuje tak jak mowisz i powiem co z tego wyszlo. ;)

Edit. No dziala super xD Wielkie dzieki. Moglbys wytlumaczyc dlaczego tutaj trzeba przeciazyc operator int a nie przypisania?

0

Tak jak pisałeś operator= będzie wywoływany na rzecz klasy, a zapis int a = cos powoduje wywołanie operatora= na rzecz zmiennej a, a nie Twojego obiektu coś

0

Chyba rozumiem czyli przeciazac operator= bede jesli np. chcialbym wywolac cos takiego:

mam jakas klase x
x nowy;
nowy=...;

Wtedy musze odpowiednio przeciazyc operator= aby wiedzial w jaki sposob przypisac powiedzmy stringa do mojej klasy tak?

0

Tworzenie obiektu powiedzmy ze stringa można rozwiązać po prostu przez konstruktor. Pamiętaj, że zapis NazwaKlasy obiekt="jakis string" wywołuje konstruktor, a nie operator przypisania. Operator przypisania zostaw domyślny (jeżeli nie masz konstruktora kopiującego i destruktora, gdy tak nie jest, to powinieneś mieć całą trójcę zdefiniowaną lub zakazaną). Ja bym dodatkowo dodał modyfikator explicit, ponieważ automatyczna konwersja zwykle jest bardziej szkodliwa, niż pomocna. Bez modyfikatora explicit w konstruktorze zapis:

Klasa obiekt;
obiekt="jakis string"; 

powinien być poprawny przy definiowaniu jedynie Klasa(std::string) i Klasa& operator=(Klasa&).

0

Akurat string podalem tak przykladowo. Oczywiscie konstruktor i destruktor zdefiniowane mam w klasie. Konstruktora kopiujacego natomiast nie bo jest mi niepotrzebny. Przydaje sie on kiedy operuje sie na wskaznikach na obiekty, zeby zapobiec tworzenia przez konstruktor kopiujacy domyslny "plytkiej kopii" obiektu. W zasadzie sie pytalem o to w jakich przypadkach stosuje sie przeciazony operator=, bo dalej nie jest to jednoznacznie wyjasnione ;). Operator explicit znam i staram sie uzywac, jesli nie zapomne ;p, chociaz piszac nie zawsze pamietam(jestem swiadom) ze moze byc w pewnym przypisaniu wykonana konwersja typow i zeby zapobiegac takiej niejawnej konwersji.

1

Co do konstruktora kopiującego to się mylisz, jeżeli masz operator przypisania to na 99% potrzebny jest konstruktor kopiujący.

Operator przypisania stosuje się wtedy, kiedy jest potrzebne przypisanie twojemu obiektowi jakiegoś innego obiektu lub zmiennej typu wbudowanego. Trzeba pamiętać, że operator przypisania startuje tylko podczas przypisania, np. nie odpala się podczas inicjalizacji zmiennej, kopiowaniu w trakcie przekazywania obiektu jako parametr funkcji.

0

Dzieki, juz teraz rozumiem. Wlasnie tak myslalem, ale troche zle sie wyrazilem.

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