Così, che cosa è la cosa con le classi che hanno "*" nel loro nome (per esempio, le classi senza file cpp non hanno Asterix, tutti gli altri fanno) ?? ?
Hai sicuramente bisogno di conoscere i puntatori. test *
e test
sono due tipi completamente diversi in C++. Ecco due variabili con questi tipi:
test t;
test* p;
Qui, t
è di tipo test
, e p
come tipo test*
. Descriviamo test*
come "puntatore a test
".
Si può spesso pensare a un puntatore come all'indirizzo di memoria di un oggetto. Quindi in p
, poiché è un puntatore, è possibile memorizzare l'indirizzo di memoria di t
, che è un test
. Per ottenere l'indirizzo di un oggetto, si usa il &
operatore unario, in questo modo:
test t;
test* p = &t;
noti che t
è un oggetto test
. Non hai bisogno di dire new test()
. Questo è dove C++ differisce da altri linguaggi che potresti aver usato, come C# e Java. Nel codice C++ sopra, t
è un oggetto test
.
Tuttavia, è possibile creare oggetti con new test()
, qual è la differenza?
test t;
crea un oggetto test
con durata di archiviazione automatica. Ciò significa che viene distrutto alla fine del suo ambito (spesso la funzione viene dichiarata all'interno).
new test()
crea un oggetto test
con durata di archiviazione dinamica. Ciò significa che devi distruggere l'oggetto manualmente, altrimenti avrai una perdita di memoria. Questa espressione restituisce un puntatore e così si può inizializzare un oggetto di puntatore con esso:
test* p = new test();
Così ora diamo un'occhiata al vostro problema:
test t=new test("rrr",8);
Ora sappiamo che new test("rrr", 8)
restituisce un puntatore a test
(un test*
). Tuttavia, stai cercando di assegnarlo a un oggetto test
. Semplicemente non puoi farlo. Uno di questi è un indirizzo e l'altro è un test
. Quindi il compilatore dice "non esiste un costruttore adatto per convertire da test *
a test
". Ha senso ora, vero?
Invece, si consiglia di utilizzare la durata di archiviazione automatica. Usa solo new
se davvero ne hai bisogno. Quindi, basta fare:
test t("rrr", 8);
Nizza, la risposta è molto migliore del mio :) +1 –
tnx un sacco. hai indovinato, ho programmato in java e C# quindi sono un po 'in difficoltà con C++ :) .... – klo
@klo Se provi a programmare C++ come hai programmato Java, farai molti errori. Non sono affatto simili. – john