[ glorius @ 20.06.2013. 18:44 ] @
Radio sam sa clone() funkcijom za kopiranje polimorfnih klasa i tu mi je skoro sve jasno. Skoro sam citao neki clanak i tu je spomenuto da bi dobro dizajnirana apstraktna klasa trebala da ima PRIVATE copy constructor. Do sada sam uvek pravio copy constructor apstraktne klase kao public jer nisam mnogo brinuo o tome.

Evo koda pa da objasnim sta mi nije jasno.

Code:


class Base
{
public:
    Base() {}

    virtual Base* clone() const = 0;
protected:                                            // !!! Mora biti protected da bi derived klasa pristupila copy constructor-u bazne klase da bi se ceo objekat konstruisao
    Base(const Base& rhs)
    {
        baseData = rhs.baseData;
    }
private:
    int baseData;
};

class Derived : public Base
{
public:
    Derived(){}
    Derived(const Derived& rhs)
        : Base(rhs)                                    // !!! Pozivanje baznog konstruktora
    {
        derivedData = rhs.derivedData;
    }

    Base* clone() const                            // !!! Kopiranje objekta
    {
        Base* pClone = new Derived(*this);
        return pClone;
    }
private:
    int derivedData;
};



Ovo lepo radi jedino sto protivreci dizajnu o kojem sam citao na nekoliko mesta ali nisam mogao da nadjem objasnjenje zasto spominju da treba biti private ( a ne protected ).

Jedino ako ne misle da treba da bude private u slucaju da abstract klasa nema podataka...?
[ Nedeljko @ 20.06.2013. 22:20 ] @
Konstruktor kopije se definiše kao privatan kada se želi zabranjivanje kopiranja objekata tog tipa. Poenta je da konstruktor kopije i operator dodele budu privatni, a da ti onaj copy() metod služi za pravljenje kopija, jer se on ponaša polimorfno.