Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
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


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Arianespace potrebbe lanciare il primo r...
Google Pixel 10a disponibile al prezzo m...
Microsoft Copilot nei guai: email riserv...
AOC a 399€ su Amazon: QD-OLED 240 Hz e 0...
La Cina ha recuperato dal mare il primo ...
Boeing CST-100 Starliner: la NASA rende ...
hiop e TaDa uniscono le forze per trasfo...
Thermal Grizzly mostra il Ryzen 7 9850X3...
AMD Ryzen 'Olympic Ridge' Zen 6 per desk...
Donald Trump renderà pubbliche in...
Prezzo mai visto da mesi: ECOVACS DEEBOT...
Non solo S26, Samsung sta per lanciare a...
Windows 11 avrà a breve uno Speed...
Ask Intel: l'assistente IA che ti aiuta ...
Nasce Freedom.gov: il portale USA per ag...
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: 22:09.


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