[ Goran Rakić @ 12.12.2005. 23:19 ] @
Imam sablon koji implementira dinamicki niz (primer sa vezbi na faksu). Sada ja hocu da mogu da uradim ovo:
Code:

Niz<double> s1;
s1[0] = 3.23;
Niz<int> s2(s1);
s2[2] = 4;


Stoga sam napravio konstruktor sa parametrom:

Code:

template <class U>
Niz(const Niz<U>& n) :
        _duzina(n._duzina),
        _obezbedjeno(n._duzina),
        _elementi( n._duzina>0 ? new T[n._duzina] : 0)
{
       for( unsigned i=0; i<_duzina; i++ )
            _elementi[i] = (T) n._elementi[i];
}


I posto su _duzina i _elementi privatni, uveo da je Niz<int> prijatelj svih raspisa sablona Niz. I to sada radi. Medjutim problem je kada su tipovi isti:
Code:

Niz<int> q1;
q1[0] = 3;
Niz<int> q2(q1);
cout << "q1: " << q1 << endl;
cout << "q2: " << q2 << endl;


Tada uopste ne bude pozvan ovaj moj konstruktor, vec nesto sto stvarno predstavi elemente q1 kao elemente q2 ali pri tom izgleda da ne pravi kopiju. Tako da pri destrukciji naletim na problem. Izlaz:
Code:

Konstruktor bez parametara
q1: [1:3]
q2: [1:3]
a.out(21157) malloc: *** error for object 0x500180: double free


Prikazio sam ceo kod u prilogu.

Meni nije jasno gde je uopste nestao poziv konstruktora sa parametrom??? Ok, kada je U == T raspis sablona izgleda nije ispravan, ali na koji nacin on pravi objekat p2, odnosno q2 tako da njegova duzina i elementi budu oni iz p1, odnosno q1... I naravno, kako treba napisati kod da ovo funkcionise?

[ Goran Rakić @ 12.12.2005. 23:29 ] @
Ok, provalio sam da ako dodam i:

Code:

        Niz(const Niz<T>& n) :
                _duzina(n._duzina),
                _obezbedjeno(n._duzina),
                _elementi( n._duzina>0 ? new T[n._duzina] : 0)
        {
        
        cout << "Konstruktor sa parametrom istog tipa" << endl;
                
        for( unsigned i=0; i<_duzina; i++ )
                _elementi[i] = n._elementi[i];
        }                                                                                                              


sve radi, tj. u ovom drugom slucaju biva pozvan ovaj konstruktor. Medjutim ostaje mi nepoznato zasto to nije radilo sa prethodnim konstruktorom i sta je bilo pozivano umesto njega?
[ Dragi Tata @ 13.12.2005. 01:24 ] @
Nemam sad vremena da gledam kompletnu klasu, ali bih rekao da se poziva konstruktor za kopiranje koji verovatno nisi implementirao pa ga je kompajler automatski generisao.
[ Goran Rakić @ 13.12.2005. 08:52 ] @
U pravu si, prevideo sam da se konstruktor kopije poziva kada se kao parametar konstruktora prosledi objekat istog tipa. To onda znaci da onaj sablonski konstruktor ne moze da se raspise i u konstruktor kopije, vec je potrebno njega eksplicitno definisati. Zasto to?

U cemu je razlika izmedju Niz(Niz<int>& n) raspisano iz sablonskog konstruktora za U=int i konstruktora kopije Niz(Niz<T>& n) u raspisu za T=int? Zar to nisu iste funkcije?

[Ovu poruku je menjao Goran Rakić dana 13.12.2005. u 10:54 GMT+1]