Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Al .NEXT 2026 di Chicago, Nutanix ha mostrato quanto sia cambiata: una piattaforma software che gestisce VM, container e carichi di lavoro IA ovunque, dall’on-premise al cloud pubblico. Con un’esecuzione rapidissima sulle partnership e sulla migrazione da VMware
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-07-2010, 12:02   #1
Zero-Giulio
Member
 
Iscritto dal: May 2007
Messaggi: 292
[C++] costruttori di copia e operatori assegnamento problem :-(

Ecco un breve pezzo di codice con una classe che sto scrivendo

Codice:
template <typename T>
class array {

        template <typename U>
        friend class array;

        friend ostream & operator << (ostream & os, const array <T> & v) {
            cout << endl;
            for (unsigned int i = 0; i < v.num_; i++)
                cout << v.ptr [i] << " ";
            for (unsigned int i = v.num_; i < v.size_; i++)
                cout << "? ";
            cout << endl;
            return os;
        }

    public:

        explicit array (const unsigned int & s)
            : incr_ (s)
            , size_ (s)
            , num_ (0) {
            alloc ();
        }

        explicit array (const unsigned int & s, const unsigned int & i)
            : incr_ (i)
            , size_ (s)
            , num_ (0) {
            if (incr_ < 1) {
                arrayWarning ("in array constructor: incr_ must be a >= 1 unsigned int");
                incr_ = 1;
            }
            alloc ();
        }

        template <typename U>
        array (const array <U> & a)
            : incr_ (a.incr_)
            , size_ (a.size_)
            , num_ (a.num_) {
            alloc ();
            for (unsigned int i = 0; i < num_; i++)
                ptr [i] = static_cast <T> (a.ptr [i]);
        }

        ~array () {
            delete [] ptr;
        }

        template <typename U>
        bool operator != (const array <U> & a) const {
            if (num_ != a.num_)
                return true;
            for (unsigned int i = 0; i < num_; i++)
                if (ptr [i] != a.ptr [i])
                    return true;
            return false;
        }

        template <typename U>
        bool operator == (const array <U> & a) const {
            return !(*this !=  a);
        }

        template <typename U>
        const array <T> & operator = (const array <U> & a) {
            if (size_ < a.num_)
                add (a.size_);
            num_ = a.num_;
            for (unsigned int i = 0; i < num_; i++)
                ptr [i] = static_cast <T> (a.ptr [i]);
            return *this;
        }

        template <typename U>
        array <T> & in (const U & u) {
            add (1);
            ptr [num_++] = static_cast <T> (u);
            return *this;
        }

        template <typename U>
        array <T> & in (const array <U> & a) {
            unsigned int n = a.num_;
            add (n);
            for (unsigned int i = 0; i < n; i++)
                ptr [num_++] = static_cast <T> (a.ptr [i]);
            return *this;
        }

        unsigned int setIncr (const unsigned int & i) {
            unsigned int dummie = incr_;
            if (i < 1)
                arrayWarning ("in setIncr: function parameter must be a >= 1 unsigned int");
            else
                incr_ = i;
            return dummie;
        }

        unsigned int incr () const {
            return incr_;
        }

        unsigned int size () const {
            return size_;
        }

        unsigned int num () const {
            return num_;
        }

    private:

        void alloc () {
            if (size_ < 1)
                arrayError ("in array constructor: size_ must be a >= 1 unsigned int");
            try {
                ptr = new T [size_];
            }
            catch (bad_alloc & err_msg) {
                arrayAllocationError (Str (size_));
            }
        }

        void add (const unsigned int & n) {
            unsigned int min_size = num_ + n;
            if (size_ < min_size) {
                size_ = max (size_ + incr_, min_size);
                T * new_ptr;
                try {
                    new_ptr = new T [size_];
                }
                catch (bad_alloc & err_msg) {
                    arrayAllocationError (Str (size_));
                }
                for (unsigned int i = 0; i < num_; i++)
                    new_ptr [i] = ptr [i];
                delete [] ptr;
                ptr = new_ptr;
            }
        }

        unsigned int incr_;
        unsigned int size_;
        unsigned int num_;
        T * ptr;

};
Come potete vedere, ci sono costruttori, costruttori di copia, operatori relazionali e di assegamento e altro.
Il costruttore di copia e quello di assegnamento sono scritti come template.
Mi domando se questo crei problemi.

Il punto è questo:

1) se faccio

array <double> a1 (4);
array <double> a2 (8);

a2 = a1

il codice funziona (a2 mantiene size_ e incr_ e riceve da a1 num_ e i primi num_ elementi di ptr).

2) se invece ho

array <double> a1 (4);
array <double> a2 (8);

a2 = a1

il codice non funziona (a2 riceve anche size_ e incr_ da a1).
Ho cercato di debuggare il codice cercando di capire perchè questo succedesse e ho scoperto che
l'operazione a2 = a1 NON chiama nè il mio operatore di assegnamento, nè altri mie funzioni.
Ho messo delle cout dentro tutta la mia classe ma niente.
Se scrivo a2 = a1, con i tipi di a1 e a2 uguali, viene invocato qualcosa che io non ho scritto.

Ora io mi domando, sarà mica che quello scemo del compilatore invoca un qualche costruttore implicito o
qualche operatore che solo lui sa (quelli che invoca quando un utente non li crea per intenderci)?
Oppure sono io lo scemo e c'è qualcosa che non so?

E nel caso il compilatore usasse qualcosa di suo... Perchè lo fa?
E' per via del fatto che io ho usato i template?

Ma se io scrivo

template <typename U> const array <T> & operator = (const array <U> & a)

non dovrei avere come caso particolare anche

const array <T> & operator = (const array <T> & a)

???

Non capisco.

P.S.: se aggiungo un costruttore di copia e un operatore di assegnamento senza i template tutto funziona.
E' solo che non piace riempire il codice di funzioni ridondanti. Insomma,

const array <T> & operator = (const array <T> & a)

dovrebbe essere un caso particolare di

template <typename U> const array <T> & operator = (const array <U> & a)

no?
Perchè doverli scrivere entrambi???
Zero-Giulio è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
Mova S70 Roller è uno dei robot aspirapo...
Iliad lancia la nuova offerta Giga Prime...
Vivo X300 Ultra è disponibile in ...
La NASA ha confermato il supporto per il...
Sierra Space ha completato il test acust...
Ryzen 7 5800X3D pronto a tornare sul mer...
NASA: l'amministrazione Trump prosegue s...
L'Iran avrebbe acquistato un satellite p...
VivaTech compie dieci anni e raddoppia p...
Le vendite di CPU si sono ridotte di 25 ...
Starship: SpaceX ha completato lo static...
Huawei FusionSolar Roadshow 2026: l'inno...
Nuovo trailer per Street Fighter: un fil...
Sovranità sui dati: arriva la pri...
Schede video NVIDIA e AMD di nuovo su Ma...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:43.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v