Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-05-2007, 21:13   #1
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
[C++] Allocazione dinamica con puntatore

Salve,
aiutatemi a comprendere meglio quanto segue :

Date :

Codice:
Class B {

    public :
    int a,b;
    void f();
}

Class D : public B {
    
    public:
    int c,d;
    void f();

}

int main() {

D d;
B* p = new D;

}
L'istruzione "B* p = new D;" , corregetemi se sbaglio, alloca uno spazio di memoria per ospitare tutti i membri della classe D e l'indirizzo di tale allocazione è passato a p. Il punto però è che p non è dello stesso tipo ma della classe base.

Ora mi chiedo : in memoria c'è cmq tutto D soltanto che il puntatore p può referenziare soltanto la parte B della classe D. Dico bene ?

Nel momento in cui p volesse referenziare tutto D come faccio ? Dovrei, penso effettuare un casting di p da B* a D*. ma come ?

se eseguo :

D* pb=static_cast<D*>p;

in questo modo col puntatore pb riesco a referenziare la parte mancante della classe D che era impossibilitato da p ?
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2007, 21:35   #2
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da leon84 Guarda i messaggi
Salve,
aiutatemi a comprendere meglio quanto segue :

Date :

Codice:
Class B {

    public :
    int a,b;
    void f();
}

Class D : public B {
    
    public:
    int c,d;
    void f();

}

int main() {

D d;
B* p = new D;

}
L'istruzione "B* p = new D;" , corregetemi se sbaglio, alloca uno spazio di memoria per ospitare tutti i membri della classe D e l'indirizzo di tale allocazione è passato a p. Il punto però è che p non è dello stesso tipo ma della classe base.

Ora mi chiedo : in memoria c'è cmq tutto D soltanto che il puntatore p può referenziare soltanto la parte B della classe D. Dico bene ?

Nel momento in cui p volesse referenziare tutto D come faccio ? Dovrei, penso effettuare un casting di p da B* a D*. ma come ?

se eseguo :

D* pb=static_cast<D*>p;

in questo modo col puntatore pb riesco a referenziare la parte mancante della classe D che era impossibilitato da p ?
L'idea e' corretta, solo che al posto di static_cast devi usare dynamic_cast, in quanto solo durante l'esecuzione del programma hai modo di capire se l'oggetto p e' effettivamente di tipo D oppure e' un'altra classe.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2007, 21:40   #3
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Quindi se avevo inizializzato con un costruttore gli attributi c e d della classe D dopo il casting riuscirei comunque a referenziarli e trovarci i valori di inizializzazione grazie al puntatore pb ?
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2007, 21:45   #4
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Mi è venuto un ennesimo dubbio:

metti che ho:

Codice:
void g (B& b) {
    b.f();
}

int main() {

B b;
g(b) ; // la g() richiama B::f()
D d;
g(d); //la g() richiama D::f()
}
Ovviamente considerando che la f() in B è definita virtual.

La domanda è : ma se nell'ultimo caso viene invocata D::f() può essere, anzi è probabile che essa operi sugli attributi di D che B non ha. Come fa il puntatore a referenziare correttamente quegli attributi ?

Forse sto sbagliando perché in realtà è solo la chiamata ad essere invocata il resto delle istruzioni di f() si svolgono proprio come se fossero state invocate da d.f(); è un mio pensiero ... chissà .. delucidami
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2007, 22:46   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ogni volta che instanzi un oggetto di una classe derivata viene instanziato anche un oggetto della classe base....
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2007, 22:47   #6
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Quote:
Originariamente inviato da cionci Guarda i messaggi
Ogni volta che instanzi un oggetto di una classe derivata viene instanziato anche un oggetto della classe base....
Certo perché implicitamente viene invocato il costruttore della classe base. giusto ?
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2007, 22:51   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Giusto...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2007, 13:20   #8
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Scusate se riapro l'argomento ma io riesco ad effettuare la conversione anche utilizzando static_cast più che dynamic_cast. Mi spiegate ?

Non riesco a capire la differenza di : tempo di esecuzione e compilazione. Mi spiego :

Se ho :
B b;
D d;
B* pb = &b;
D* pd = static_cast<D*> (pb);

Se a pb assegno l'indirizzo di un tipo b per forza di cose nel cast successivo il compilatore (e quindi al tempo di compilazione sa che pb punta a un tipo b). In qualche circostanze non riesce a saperlo al tempo di compilazione ?
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2007, 10:22   #9
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da leon84 Guarda i messaggi
Scusate se riapro l'argomento ma io riesco ad effettuare la conversione anche utilizzando static_cast più che dynamic_cast. Mi spiegate ?

Non riesco a capire la differenza di : tempo di esecuzione e compilazione. Mi spiego :

Se ho :
B b;
D d;
B* pb = &b;
D* pd = static_cast<D*> (pb);

Se a pb assegno l'indirizzo di un tipo b per forza di cose nel cast successivo il compilatore (e quindi al tempo di compilazione sa che pb punta a un tipo b). In qualche circostanze non riesce a saperlo al tempo di compilazione ?
Quando ad esempio passi il puntatore ad un'altra funzione:
Codice:
void foo( B* b )
{
  D* d = static_cast<D*>(b);
  /* .... */
}

void boo()
{
  B* b = new B();
  B* b2= new D();
  foo(b);
  foo(b2);
}
In questo caso il compilatore non puo' sapere tutti i casi in cui usi la funzione foo, e quindi verificare durante la compilazione che venga sempre passato un tipo D
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Il MacBook Pro è sempre più...
Il prezzo della Switch 2 potrebbe divent...
TikTok chiarisce il funzionamento della ...
Samsung Galaxy A07 5G: il nuovo entry le...
Realme 16 in arrivo: un mix tra iPhone A...
Domenica di follia su Amazon: iPhone 17 ...
Questo portatile HP OMEN con Core Ultra ...
Robot aspirapolvere al prezzo giusto: le...
Il nuovo M5 Max potrebbe avere una GPU p...
Pulizie automatiche al top (e a prezzo B...
Casa più calda, spese più leggere: Tado ...
Mini PC mostruoso in offerta nascosta su...
Netflix promette 45 giorni di esclusivit...
Gigabyte: un handheld? Sì, ma sol...
Samsung conferma l'arrivo di tre variant...
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: 04:14.


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