ragazzi per istanziare un oggetto nel main conviene fare:
myClass c;
oppure
myClass *c;
c= new myClass;
?
mi dite che differenza c'è tra i 2 e perchè dovrei preferire il metodo con la new?
grazie
ragazzi per istanziare un oggetto nel main conviene fare:
myClass c;
oppure
myClass *c;
c= new myClass;
?
mi dite che differenza c'è tra i 2 e perchè dovrei preferire il metodo con la new?
grazie
Come da tuo titolo: il primo metodo e' statico, il secondo dinamico
Statico: myClass c;
tutte le risorse necessarie vengono allocate ancor prima che parta l'esecuzione del programma perché lo spazio occupato dalla classe e' definito in fase di compilazione.
Questo significa che sia che tu utilizzi veramente l'istanza oppure la dichiari solo (salvo ottimizzazioni del compilatore) lo spazio in memoria viene ugualmente riservato (e quindi sprecato in caso di inutilizzo)
Questo puo sembrare irrilevante per una piccola classe di esempio, ma quando queste iniziano a diventare strutture complesse contenenti array di grosse dimensioni lo spazio sprecato e' considerevole.
D'altra parte, in questo modo se la variabile viene sovrascritta spesso in questo modo si evita di ripetere continuamente la procedura di allocazioen in memoria.
L'occupazione di memoria perdura fino alla terminazione del programma. Questo metodo e' corretto se la variabile viene utilizzata durante gran parte del ciclo di vita del programma.
Dinamico : myClass *c= new myClass;
Sintassi propria di linguaggi ad "alto livello", in memoria viene riservato un puntatore (dimensioni trascurabili e indipendenti dalla classe) e l'istanza viene generata dinamicamente durante l'esecuzione e solo quando viene richiamata l'istruzione "new myClass;".
Un istanza generata con new puo quindi essere creata nel momento in cui serve e distrutta nell'istante stesso in cui non e' piu necessaria. (in modo da liberare risorse che potrebbero servire ad altri)
Tutto questo sembra insignificante per la maggior parte delle applicazioni che si scrivono, ma se pensi a un algoritmo di compressione/decompressione file che usa grandi quantitativi di memoria : non sarebbe carino che iniziasse a occupare il massimo della memoria potenzialmente necessaria ancor prima di dirgli su quali file dovrà lavorare.
molto interessante la tua spiegazione, sopratutto quando dici:
mi trovo adesso a scrivere un programma che deve instanziare un'array di una struttura di dati:tutte le risorse necessarie vengono allocate ancor prima che parta l'esecuzione del programma perché lo spazio occupato dalla classe e' definito in fase di compilazione
...
D'altra parte, in questo modo se la variabile viene sovrascritta spesso in questo modo si evita di ripetere continuamente la procedura di allocazioen in memoria.
L'occupazione di memoria perdura fino alla terminazione del programma. Questo metodo e' corretto se la variabile viene utilizzata durante gran parte del ciclo di vita del programma
...
essendo la WAVEHDR la struttura principale del mio programma (la uso come buffer) mi conviene secondo te quindi molto di più inizializzarla in modo "statico" o "dinamico" ??codice:// Define WAVEHDR Structure (WaveForm API) int num_buffers = 3; WAVEHDR *buff = new WAVEHDR[num_buffers]; for (int i = 0; i<num_buffers; i++) { ZeroMemory(&buff[i], sizeof(buff)); buff[i].lpData = (LPSTR) malloc(32768); buff[i].dwBufferLength = 32768; buff[i].dwBytesRecorded = 0; buff[i].dwFlags = 0; waveInPrepareHeader(hwi, &buff[i], sizeof(WAVEHDR)); waveInAddBuffer(hwi, &buff[i], sizeof(WAVEHDR)); }
grazie
Alla batteria dai retta ballA
Il lifetime del primo è gestito dal compilatore, il secondo lo devi gestire tu.Originariamente inviato da xnavigator
mi dite che differenza c'è tra i 2
Perchè dovresti preferirlo? Sono cose diverse con scopi diversi.e perchè dovrei preferire il metodo con la new?
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.
bhè mi sembra un'ottima spiegazione..Originariamente inviato da lelmarir
Come da tuo titolo: il primo metodo e' statico, il secondo dinamico
Statico: myClass c;
[...]
potenzialmente necessaria ancor prima di dirgli su quali file dovrà lavorare.
nel mio caso:
a. la mia classe è abbastanza piccola
b. la dovrei utilizzare per tutta la vita del mio programma
quindi credo di utilizzare la dichiarazione "statica"...
aspetto anche altri pareri comunque, anche perchè il mio prof se ricordo bene vuole che ogni variabile sia inizializzata con la new... ( e non riesco a capire il perchè )
Non è che ha scambiato il C++ con Java?Originariamente inviato da xnavigator
anche perchè il mio prof se ricordo bene vuole che ogni variabile sia inizializzata con la new... ( e non riesco a capire il perchè )
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.
Originariamente inviato da shodan
Non è che ha scambiato il C++ con Java?
tutto può essere........![]()
non è che casomai c'è un link ad un sito ufficiale ( del tipo cplusplus.com ) che spiega che si può utilizzare tranquillamente l'allocazione statica? cosi lo riporto per stare tranquillo
inoltre piccola domanda sulla sintassi:
per usare il costruttore con argomenti con il metodo statico come farei?
myClass myIstanza(1.0)?
grazie
"quel" prof non mi pare abbia mai preteso nulla del genere, forse ti confondi col fatto che pretende l'allocazione dinamica con new (e deallocazione con delete) senza ricorrere alle funzioni malloc(), calloc() e free() del C.Originariamente inviato da xnavigator
anche perchè il mio prof se ricordo bene vuole che ogni variabile sia inizializzata con la new... ( e non riesco a capire il perchè )
Se poi da quest'anno gli è venuta anche questa fissazione, allora fammelo sapere che vado ad agraria finché sono in tempo, anche se con lui ho già concluso da un pezzo.
Dipende da come hai definito il costruttore.Originariamente inviato da xnavigator
inoltre piccola domanda sulla sintassi:
per usare il costruttore con argomenti con il metodo statico come farei?
myClass myIstanza(1.0)?
EDIT: intendo ovviamente dire che quello sarebbe il modo corretto se la tua classe avesse un costruttore adatto per quel tipo di dichiarazione.
every day above ground is a good one
ok perfetto quindi è giusto fare cosi thxOriginariamente inviato da YuYevon
EDIT: intendo ovviamente dire che quello sarebbe il modo corretto se la tua classe avesse un costruttore adatto per quel tipo di dichiarazione.![]()
E spiegato in tutti i libri nei primi capitoli.
Scrivere:
non è diverso da scrivere:codice:myClass myIstanza;
L'unica cosa da fare attenzione è lo scope (il lifetime) della variabile, che in C++ può essere ridotto in vari modi. (Ad esempio dichiarando la variabile dentro un if o un for. Usciti da if o for non esiste più, ma vale per tutte le variabili dichiarate sullo stack, nessuna esclusa).codice:int variabile;
Probabilmente il tuo prof vuol farti usare new ( e relative deleteper fare pratica).
Si.
per usare il costruttore con argomenti con il metodo statico come farei?
myClass myIstanza(1.0)
Notare che funziona anche con le variabili fondamentali.
codice:char c('a'); int k(0);
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.