Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ Szablon klasy dla liczb zespolonych

Ostatnio zmodyfikowano 2016-05-05 23:49
Autor Wiadomość
jolkaaa3
Temat założony przez niniejszego użytkownika
C++ Szablon klasy dla liczb zespolonych
» 2016-05-05 13:56:56
P-147963
carlosmay
» 2016-05-05 16:24:08
P-147964
mateczek
» 2016-05-05 18:22:12
ale czy naprawdę do tego potrzeba szablonów ??

C/C++
#include <iostream>
using namespace std;

class zespolone {
    double real;
    double uroj;
public:
    zespolone( double r, double i ) {
        real = r;
        uroj = i;
    }
   
    zespolone() {
        real = 0;
        uroj = 0;
    }
    zespolone operator +( zespolone & z ) {
        zespolone temp;
        temp.real = real + z.real;
        temp.uroj = uroj + z.uroj;
        return temp;
       
    }
   
    friend ostream & operator <<( ostream & s, zespolone & z );
   
};
ostream & operator <<( ostream & s, zespolone & z ) {
    return s << z.real << ",j" << z.uroj;
}

int main()
{
    int r = 5;
    double j = 4.6;
    zespolone z1( r, j );
    zespolone z2( 3, 5 );
    zespolone z3 = z1 + z2;
    cout << z3 << endl;
}
P-147965
carlosmay
» 2016-05-05 18:38:51
ale czy naprawdę do tego potrzeba szablonów ??
Takie mają zadanie.
można stworzyć np. typ Zesp<double>, Zesp<int>
Jak zrobić to inaczej?

C/C++
Zesp < int > zesp_1, zesp_2;
// ...
std::cout << zesp_1 + zesp_2 << std::endl;
std::cout << zesp_1 + 2 << std::endl;
std::cout << 2 + zesp_2 << std::endl;
P-147967
jolkaaa3
Temat założony przez niniejszego użytkownika
» 2016-05-05 20:41:09
Muszę napisać program właśnie za pomocą szablonu.
P-147970
carlosmay
» 2016-05-05 23:49:31
Szablony funkcji
Szablony klas
Szablony funkcji - 4programmers

C/C++
template < typename Type >
class Complex
{
    Type m_real;
    Type m_image;
public:
    Complex( Type re = 0, Type im = 0 )
        : m_real( re )
         , m_image( im )
    { }
    ~Complex() { }
   
    Type getReal() const { return m_real; }
    Type getImage() const { return m_image; }
   
    Complex operator +( const Complex & z ) // wersja dla (zesp + zesp2)
    {
        Complex temp = * this;
        //return Complex(this->m_real + z.m_real, this->m_image + z.m_image);
        // lub
        return temp += z; // lepiej ta opcja, korzysta z operator+=, nie ma powielania kodu
    }
   
    Complex operator +( Type num ) // wersja dla (zesp + liczba)
    {
        //... twój kod
    }
   
    friend Complex < Type > operator +( Type num, const Complex < Type >& z ) // wersja dla (liczba + zesp)
    {
        //... twój kod
    }
   
    Complex operator +=( const Complex & z ) // wer. dla (zesp += zesp2)
    {
        this->m_real += z.m_real;
        this->m_image += z.m_image;
        return * this;
    }
   
    Complex operator +=( Type num ) // wer. dla (zesp += liczba)
    {
        // ... twój kod
    }
   
    // resztę implementacji pozostawiam
   
    template < typename Type >
    friend std::ostream & operator <<( std::ostream & os, const Complex < Type >& z )
    {
        return os << "[" << z.m_real << " + " << z.m_image << "]";
    }
};

int main()
{
    Complex < int > a( 1, 2 );
    Complex < int > b( 2, 4 );
    std::cout <<( a + b ) << std::endl;
    std::cout << "[" << a.getReal() << " + " << a.getImage() << "]" << std::endl;
}
opertor +=
 dodałem od siebie. Jeśli nie może go być, trzeba skorzystać z pierwszej opcji
w
operator +
 (tej zakomentowanej).

edit: Poprawiłem kod, bo nie do końca zgodny był z zasadami.
operatro +
 w swoim ciele zabezpiecza lewy operand dodawania przed nadpisaniem, stosując obiekt tymczasowy.
Dopiero ten zastąpiony (lewy) używa
operator +=
 z prawym operandem.
W przeciwnym razie zwykłe dodawanie powoduje nadpisanie wartości lewego operandu, co jest nieprawidłowym zachowaniem.

Poprzedni kod też liczył poprawnie, lecz zabezpieczenie było w
operator +=
, gdzie tworzony był obiekt tymczasowy,
przy wywołaniu skróconego operatora dodawanie
+=
 (nadmiarowa operacja).
P-147971
« 1 »
  Strona 1 z 1