Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-12-2005, 10:08   #1
silvertears
Member
 
Iscritto dal: Sep 2001
Messaggi: 163
[C++]Strano comportamento costruttore di copia ridefinito

Salve a tutti, vi posto quà di seguito il codice di un programmino d'esempio per spiegare il mio problema:

Codice:
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;

struct punto {double x, y;};
class poligono
{   int nvertici; punto* pp;
public:
       poligono();
       poligono (int n, const punto v[]);
       ~poligono();
       poligono(const poligono& pol);
};
poligono::poligono()
{
   nvertici = 1; pp = new punto[nvertici];
}
poligono::poligono(int n, const punto v[])
{
   nvertici = n;
   pp = new punto[nvertici];
   for (int i=0; i<nvertici; i++)
   {
       (pp+i)->x = v[i].x;
       (pp+i)->y = v[i].y;
   }
}
poligono::~poligono()
{
   delete[] pp;
}

poligono::poligono(const poligono& pol)
{
   cout<< "costruttore di copia\n";
   nvertici = pol.nvertici;
   pp = new punto[nvertici];
   for (int i= 0; i < nvertici; i++)
   {
       (pp+i)->x = (pol.pp+i)->x;
       (pp+i)->y = (pol.pp+i)->y;
   }
}

int main()
{
    punto cc[3];
    poligono bz();
    poligono test = bz; // errore a tempo di compilazione "conversion from poligono()() to non-scalar type poligono requested
    poligono test2 = poligono(3, cc);
    system("PAUSE");
    return EXIT_SUCCESS;
}

Nel main ho aggiunto i commenti alle righe che non mi quadrano, innanzitutto l'inizializzazione dell'ogetto "test" di tipo "poligono" con l'ogetto "bz" sempre di tipo "poligono",non capisco proprio perchè mi esca fuori quell'errore quando compilo.
Secondo cosa che non mi spiego, perchè quando inizializzo l'ogetto di tipo "poligono" test2 con il costruttore "poligono(3, cc)" non viene richamato il costruttore di copia? Da quello che so in quel caso dovrebbe intervenire proprio il costruttore di copia che ho ridefinito, però se mando in esecuzione l'exe non mi esce il cout del costruttore di copia.

Sapreste darmi qualche dritta?
__________________
CASE:NZXT S340 Midi-Tower Nero - Rosso, ALI:EVGA SuperNOVA 650 G2 650W, 80 PLUS Gold, Full modular, MOBO:MSI H270 GAMING M3, CPU:Intel Core i7-7700, DISSY:Noctua NH-U12S, RAM:Corsair Vengeance LPX Red, 2x8GB, 2400MHz DDR4, CL16, VGA:ZOTAC GeForce GTX 1080 AMP, HD:SEAGATE Barracuda 7200.11 1000GB + Crucial SSD MX300 525GB SATA3
silvertears è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 11:30   #2
Bane
Member
 
Iscritto dal: Aug 2003
Messaggi: 125
Temo che "poligono bz();" venga interpretato come un prototipo di
funzione, quindi la sintassi corretta nel tuo caso e' "poligono bz;".

Per la seconda domanda, sinceramente non ricordo, quindi potrei andare
ad intuito, cioe' che "poligono test2 = poligono(3, cc);" equivalga a
"poligono test2(3, cc);".
Ma a questo immagino ci eri gia' arrivato da solo... =)

Ultima modifica di Bane : 04-12-2005 alle 11:32.
Bane è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 11:57   #3
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4747
da C++ Lessons:
Il costruttore di copia è uno speciale costruttore che prende come argomento un reference a un oggetto della stessa classe e crea un nuovo oggetto che ne è una copia. Per default, il compilatore mette a disposizione un costruttore di copia che effettua una copia membro a membro dall' oggetto originale a quello che viene creato (cosiddetta copia member-wise)...

nel tuo caso, la riga poligono test2 = poligono(3, cc); non dovrebbe chiamare mai il costruttore di copia, e perchè cc è di tipo punto[], e perchè i parametri passati corrispondono agli argomenti del costruttore
PS: di solito (per come mi hanno insegnato) è consigliabile implementare un default (NULL) constructor e ridefinire l' operatore di assegnazione...
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name
Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish
Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate

Ultima modifica di jappilas : 04-12-2005 alle 13:08.
jappilas è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 13:00   #4
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
In questo caso:
Codice:
poligono test2 = poligono(3, cc);
si parla di 'inizializzazione per copia' (copy-initialization) e viene usato proprio il copy-constructor.
Pero', visto che viene creato un oggetto temporaneo utilizzato dal copy-constructor, al compilatore e' permesso saltare quest'ultimo e creare direttamente l'oggetto.
Praticamente, come ha detto Bane, e' come fosse scritto:
Codice:
poligono test2(3, cc);
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2005, 12:26   #5
silvertears
Member
 
Iscritto dal: Sep 2001
Messaggi: 163
Secondo il libro del mio prof con quell'inizializzazione dovrebbe essere richiamato proprio il costruttore di copia.
A questo punto, visto che sto esaurendo con questo argomento vi riporto un altro piccolo pezzo di codice:

Codice:
#include <cstdlib>
#include <iostream>
#include <string.h>

using namespace std;

class stringa
{      char* str;
public:
       stringa(const char s[]);
       ~stringa();
};
stringa::stringa(const char s[])
{
      str = new char[strlen(s)+1];
      strcpy(str, s);
      cout << "ogetto costruito \n";
}
stringa::~stringa()
{
      delete[] str;
      cout << "ogetto distrutto \n";
}
stringa ff()
{
        stringa sg("acqua");
        return sg;
}


int main()
{
    stringa sa = ff();
    system("PAUSE");
    return EXIT_SUCCESS;
}
Allora, secondo quello che ci sta scritto sul libro questo programma non riuscirebbe ad inizializzare l'oggetto classe sa con il risultato della funzione ff poichè al termine della funzione verrebbe chiamato il distruttore dell'oggetto sa, distruttore che va a deallocare l'array str di sa e quindi il risultato sarebbe che sa dovrebbe avere il membro str puntatore ad area di memoria deallocata.

Io ho provato a compilarlo e va tutto bene, alla fine sa risulta proprio inizializzato con il valore restituito da ff, e non solo, il distruttore dell'oggetto sg non viene mai richiamato.

Dove sta la verità?
__________________
CASE:NZXT S340 Midi-Tower Nero - Rosso, ALI:EVGA SuperNOVA 650 G2 650W, 80 PLUS Gold, Full modular, MOBO:MSI H270 GAMING M3, CPU:Intel Core i7-7700, DISSY:Noctua NH-U12S, RAM:Corsair Vengeance LPX Red, 2x8GB, 2400MHz DDR4, CL16, VGA:ZOTAC GeForce GTX 1080 AMP, HD:SEAGATE Barracuda 7200.11 1000GB + Crucial SSD MX300 525GB SATA3
silvertears è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2005, 15:47   #6
Bane
Member
 
Iscritto dal: Aug 2003
Messaggi: 125
Vediamo, cosi' ad occhio dovrebbe succedere quanto segue:

1) "stringa sg("acqua");" -> Richiama il costruttore di sg.
2) "return sg;" Costruttore di copia e distruttore di sg.

Ma il costruttore di copia non e' stato definito, quindi viene richiamato quello
di default, che inizializza il puntatore (char*) del nuovo oggetto in base al
puntatore (char*) dell'oggetto sg... punteranno quindi entrambi alla stessa
locazione di memoria, che pero' verra' deallocata subito dopo dal distruttore
di sg.

Ultima modifica di Bane : 05-12-2005 alle 15:50.
Bane è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2005, 16:05   #7
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Quote:
Originariamente inviato da silvertears
Secondo il libro del mio prof con quell'inizializzazione dovrebbe essere richiamato proprio il costruttore di copia.
Per ragioni di efficienza non viene creato l'oggetto temporaneo da dare in pasto al costruttore di copia, ma viene creato direttamente l'oggetto, diciamo cosi', finale.
Dovrebbe esserci scritto qualcosa di simile, nel tuo testo, a meno che non sia vecchio/scadente.

Quote:
Originariamente inviato da silvertears
Allora, secondo quello che ci sta scritto sul libro questo programma non riuscirebbe ad inizializzare l'oggetto classe sa con il risultato della funzione ff poichè al termine della funzione verrebbe chiamato il distruttore dell'oggetto sa, distruttore che va a deallocare l'array str di sa e quindi il risultato sarebbe che sa dovrebbe avere il membro str puntatore ad area di memoria deallocata.
Io ho provato a compilarlo e va tutto bene, alla fine sa risulta proprio inizializzato con il valore restituito da ff, e non solo, il distruttore dell'oggetto sg non viene mai richiamato.

Dove sta la verità?
Ma dovresti vedere che un oggetto e' costruito e distrutto.
Una possibile spiegazione potrebbe essere la sequenza:
Codice:
>> Passaggio 1
---
stringa ff()
{
	return stringa("acqua");
}
...
stringa sa = ff();
---
>> Passaggio 2
---
stringa sa = stringa("acqua");
---
>> Passaggio 3
---
stringa sa("acqua");
---
Con cui il compilatore arriverebbe a creare e distruggere un solo oggetto..
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
iPhone 18, il mistero sul destino della ...
Motorola lavora al nuovo Razr 70 Ultra: ...
Il programma di ridimensionamento di One...
L'industria statunitense non è co...
La NASA cambia strategia per le missioni...
Mike Fincke, l'astronauta che ha avuto u...
I Meta Ray-Ban Display potrebbero non ar...
La serie di God of War ha trovato l'attr...
Il nuovo iPhone Fold si farà atte...
Ex CEO di Intel furioso verso Wall Stree...
Un foglietto di rame e le prestazioni di...
100 agenti AI per dipendente: quello che...
Le 10 migliori offerte del weekend Amazo...
75'' e 85'' QD-Mini LED: 2 TV interessan...
Offerte Amazon sui componenti hardware P...
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: 12:45.


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