Uproszczenie operatora przypisania: Ko.kopiujacy/Destruktor

0

Witam. Zawsze mnie zastanawiało. Czy jest jakiś sposób aby w operatorze przypisania wywołać konstruktor kopiujący i destruktor zamiast bezmyslnie kopiowac to co jest w ich ciałach do operatora przypisania ?

class Macierz
{
    double **tab;
    int w; // wiersze
    int k; // kolumny
public:
    Macierz() {}; // kon. domyslny
    Macierz(int w, int k): w(w),k(k), tab(new double *[w]) // konstruktor z 2 parametrami
    {
        for(int i=0; i<w; i++)
            tab[i] = new double[k];
    }
//******************************************************************************************************************************************
    Macierz(const Macierz & m) : w(m.w), k(m.k) , tab(new double *[w])// konstruktor kopiujacy
    {
        for (int i = 0; i < w; i ++ )
            tab[i] = new double[k];

        for (int i = 0; i < w; i ++ )
            for (int j = 0; j < k; j ++ )
                tab[i][j] = m.tab[i][j];
    }
//******************************************************************************************************************************************
    ~Macierz()
    {
        for( int i = 0; i < w; i++ )
            delete[]tab[i];
        delete[] tab;
    }
//******************************************************************************************************************************************
    //Operatory
    Macierz &operator=(const Macierz wzor)
    {
        // sprawdz czy nie kopiuje sam siebie
        if(&wzor == this)
            return *this;

        // Czesc destrukcyjna
        for( int i = 0; i < w; i++ )
            delete[]tab[i];
        delete[] tab;

        //Czesc konstrukcyjna
        w=wzor.w;
        k=wzor.k;
        // przydzial na pamiec
        tab  = new double *[w];
        for (int i = 0; i <w; i ++ )
            tab[i] = new double[k];

        for (int i = 0; i < w; i ++ )
            for (int j = 0; j < k; j ++ )
                tab[i][j] = wzor.tab[i][j];
    } 
2

Tak, można i powinno się unikać pisania tego samego kodu co w konstruktorze kopiującym. Korzysta się w tym celu z copy-swap idiom: http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom

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