Przeładowywanie operatora predekrementacji

0

Witam wszystkim, mam problem z takim przeładowaniem:
c *= ---a ;
gdzie c i a to obiekty klasy K zawierające tablice z wartościami.
Mam przede wszystkim problem z funkcją operatorową -

  
K K::operator-(){
K kopia=*this;
for( unsigned int i = 0; i < m_uSize; ++i )
	for( unsigned int j = 0; j < m_uSize; ++j ){
		
		kopia.m_Tab2D[i][j]=-this->m_Tab2D[i][j];
		
	}
	return kopia;
}

I teraz tak, wyczytałem że negację muszą być robione na kopii, jednak w takim przypadku predekrementacja zadziała dla tej kopii a nie dla obiektu a. Czy można w takim przypadku zwrócić w funkcji *this żeby cały czas pracować na tym samym obiekcie?
Pozdrawiam.

1

Taka operacja powinna być zabroniona. Prekrementacja musi działać na l-values. W takim razie operator- powinien zwracać l-value, czyli modyfikować wartość obiektu a nie kopii, co jest działaniem, mówiąc eufemistycznie, niepożądanym. Wyrażenie -a jest r-value i operacje inkrementacji i dekrementacji nie mają jak na niej działać.

Nie jest to możliwe dla typów prostych:

int a = 10;
int b = ---a; // blad kompilacji

Takie samo zachowanie powinno zostać odzwierciedlone w definiowanych operatorach.

Możliwe jednak jest coś takiego: c *= - --a – to powoduje zmianę kolejności operatorów: najpierw dekrementacja, potem odwrócenie. I to jest jak najbardziej prawidłowe i zdefiniowane działanie.

0

Radził bym podejść do tego bardziej globalnie, tak czy owak przy tablice dynamicznej musisz mieć konstruktor kopiujący:
K(const K &k) { ... m_Tab2D[i][j]=k.m_Tab2D[i][j]; ... }
więc przerób go tak:
K(const K &k,double mul=1) { ... m_Tab2D[i][j]=mul*k.m_Tab2D[i][j]; ... }
Będzie to nadał działać poprawnie jako konstruktor kopiujący, ale operator - zrobisz tak:
K operator-() { return K(*this,-1); }
Ba:
operator : K operator(double mul) { return K(*this,mul); }
operator /: K operator/(double mul) { return K(*this,1/mul); }
Oraz kilka innych rzeczy.

0
_13th_Dragon napisał(a):

Radził bym podejść do tego bardziej globalnie, tak czy owak przy tablice dynamicznej musisz mieć konstruktor kopiujący:
K(const K &k) { ... m_Tab2D[i][j]=k.m_Tab2D[i][j]; ... }
więc przerób go tak:
K(const K &k,double mul=1) { ... m_Tab2D[i][j]=mul*k.m_Tab2D[i][j]; ... }
Będzie to nadał działać poprawnie jako konstruktor kopiujący, ale operator - zrobisz tak:
K operator-() { return K(*this,-1); }
Ba:
operator : K operator(double mul) { return K(*this,mul); }
operator /: K operator/(double mul) { return K(*this,1/mul); }
Oraz kilka innych rzeczy.

Sposób jest ciekawy jednak nie rozwiązuje mojego problemu - (-) zwraca kopię więc nie mogę modyfikować już obiektu a dla dekrementacji, tylko zmniejszę utworzoną kopię obiektu.

0
traffii napisał(a):

Sposób jest ciekawy jednak nie rozwiązuje mojego problemu - (-) zwraca kopię więc nie mogę modyfikować już obiektu a dla dekrementacji, tylko zmniejszę utworzoną kopię obiektu.

Zastanów się:

int a=-5;
--(-a);

Co ci na to powie kompilator?

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