Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-07-2010, 13: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


Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
Amazon: AWS cresce del 39,3%, ma gli inv...
Binance, attacco da circa 6,3 miliardi d...
Crepe, rotture e liste d'attesa, ma Appl...
World of Warcraft sbarca su browser, gra...
3+1 AI Data Platform, l'ecosistema apert...
Mistral Large 4 apre i pesi e sfida GLM-...
E-bike Engwe con doppio sconto: scegli t...
Windows 11 e consumo eccessivo di batter...
The Elder Scrolls 6 potrebbe chiamarsi S...
Bungie anticipa Destiny Legacy e aliment...
Ubisoft frena sui remake di Assassin's C...
14 offerte Amazon imperdibili, 5 sono tu...
The Duskbloods: l'uscita è stata ...
iPhone 18 Pro e iPhone 18 Pro Max per la...
MacBook Pro 14 con chip M5, 16GB e SSD d...
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: 14:37.


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