<C++> Błąd w przeciążaniu operatora?

0

Zaimplementowałęm klasę do działań na kwaternionach.

template< class T >
class Kwaternion
{
private:
   T wsp[4];
   Kwaternion(){}
   Kwaternion(T m, T x, T y, T z)
   {
       wsp[0]=m;
       wsp[1]=x;
       wsp[2]=y;
       wsp[3]=z;
    }
   ~Kwaternion(){}

//operatory
T& operator[] (int i);

Kwaternion<T>& operator= (Kwaternion<T>& k2);

//
Kwaternion<T>& operator+ ();
Kwaternion<T>& operator- ();

};

template< class T >
T& Kwaternion<T>::operator[] (const int i)
   {
      return wsp[i];
   }

template< class T >
inline Kwaternion<T>& Kwaternion<T>::operator= (Kwaternion<T>& k2)
   {
   if(&k2 != this)
   {
      for(int i=0; i<4; i++)
      {
         wsp[i] = k2.wsp[i];
      }
   }
   return *this;
}

template< class T >
inline Kwaternion<T>& Kwaternion<T>::operator+ ()
{
   return *this;
}

template< class T >
inline Kwaternion<T>& Kwaternion<T>::operator- ()
{
   Kwaternion<T> temp;
   Kwaternion<T>* t1;
   for(int i=0; i<4; i++)
   {
      temp.wsp[i] = - wsp[i];
   }
   t1 = &temp;
   return *t1;
}

t1 w funkcji operator- wprowadziłem , ponieważ po wpisaniu temp sygnalizował błąd.
Teraz w zasadzie chodzi.
Problem polega na tym, że po wywołaniu w programie funkcji operatorowej
kwaternion<int> a, b;
b= -a;

wcale nie jest zwracana wartośc -a, /tzn tylko 2 pierwsze współrze

ne się zgadzają, a pozostałe nie.
W czym jest problem?

Marian
0

Funkcja nie może zwracać referencji do zmiennej lokalnej.
Zrób to przez wartość (wyrzuć ten '&').

0

:D warning o zwracaniu zmiennej lokalnej nie pasował? I to kombo z *t1 wyszło? ;-P

Najprościej, najszybciej, przez wartość i bonusowo RVO:

template< class T >
inline Kwaternion<T> Kwaternion<T>::operator-()
{
    return Kwaternion<T>(
        -wsp[0],
        -wsp[1],
        -wsp[2],
        -wsp[3]
    );
}

Zgadza się?

0
marcinEc napisał(a)

:D warning o zwracaniu zmiennej lokalnej nie pasował? I to kombo z *t1 wyszło? ;-P

Najprościej, najszybciej, przez wartość i bonusowo RVO:

template< class T >
inline Kwaternion<T> Kwaternion<T>::operator-()
{
    return Kwaternion<T>(
        -wsp[0],
        -wsp[1],
        -wsp[2],
        -wsp[3]
    );
}

Zgadza się?

Hahahaha, skąd wiesz w jaki sposób ten return zadziała? [rotfl]

0
DevilHimself napisał(a)
marcinEc napisał(a)

:D warning o zwracaniu zmiennej lokalnej nie pasował? I to kombo z *t1 wyszło? ;-P

Najprościej, najszybciej, przez wartość i bonusowo RVO:

template< class T >
inline Kwaternion<T> Kwaternion<T>::operator-()
{
    return Kwaternion<T>(
        -wsp[0],
        -wsp[1],
        -wsp[2],
        -wsp[3]
    );
}

Zgadza się?

Hahahaha, skąd wiesz w jaki sposób ten return zadziała? [rotfl]

Że co?! [glowa]

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