2011-01-17 2 views
5

So che questo potrebbe sembrare una domanda stupida, ma perché ottengo un errore che dice qualcosa come "Cosa c'è di sbagliato nella "nuova" parola chiave in C++?

non può convertire oggetto * di opporsi

" quando si tenta di creare un'istanza di un nuovo oggetto utilizzando la dichiarazione "

Object obj = new Object(); 

"?

Devo capire che la parola chiave "new" è riservata ai puntatori? O è qualcos'altro?

+10

Non c'è niente con 'new'. Solo con la tua comprensione. – delnan

+8

Niente è sbagliato. C++ ha solo semantica diversa e devi dimenticare quello che pensavi di conoscere. Capire C++ richiede la comprensione di dove gli oggetti sono memorizzati (heap o stack). Quindi capisci perché 'new' restituisce necessariamente un puntatore. – Benoit

+4

C++ non è né Java né C#; ci sono delle differenze e tu ne hai identificato una. – andand

risposta

38
Object* obj = new Object(); 

new restituire sempre il puntatore all'oggetto.

se si scrive solo Object obj significa che obj manterrà l'oggetto stesso. Se viene dichiarata in questo modo all'interno della funzione, la memoria verrà allocata in pila e verrà cancellata una volta che si lascia tale funzione. new alloca memoria su heap, quindi il puntatore può essere restituito dalla funzione. Nota che anche il puntatore può puntare alla variabile locale (stack).

+1

sarebbe felice di sentire la ragione dietro il downvote – Andrey

+0

@Andrey Sei fortunato. [C'è gente annoiata qui intorno, oggi] (http://stackoverflow.com/questions/4716629/c-error-returning-a-char-array/4716656#4716656). Hai solo un downvote. ;-) –

+1

@Andrey: Non ero io ma se lo fosse immaginavo che fosse l'oggetto Object * ob ... 'vs Object * ob ...' Ammetto che ci stavo pensando ... ;) – FrustratedWithFormsDesigner

6

Esattamente. New crea un oggetto sull'heap e restituisce un puntatore ad esso.

8

Dal new restituisce un puntatore, si dovrebbe utilizzare

Object *obj = new Object(); 
+2

+1 per 'Oggetto * obj' su' Oggetto * obj'. – FrustratedWithFormsDesigner

+1

Preferisco Object * obj me stesso. – ThomasMcLeod

+5

@Thomas: Che ne dite di 'Object * obj'? ;-) – fredoverflow

6

il nuovo operatore fa un puntatore ad un oggetto

lì per Object *obj = new Object() dovrebbe funzionare.

ma solo Object obj() costruisce l'oggetto appena ma nello spazio di stack

+0

'Oggetto obj()' può essere variabile globale e non sarà in pila – Andrey

+6

'Oggetto obj();' dichiara una funzione chiamata 'obj' che non accetta parametri e restituisce un' Oggetto'. – fredoverflow

6

Object obj;

è tutto ciò che serve. Crea l'oggetto obj.

+2

Probabilmente è quello di cui ha bisogno; ma non possiamo darlo per scontato. – Benoit

1

Avrei semplicemente lasciato un commento, ma a quanto pare ho bisogno di un certo rappresentante per farlo.

In Java, le variabili utilizzate per memorizzare gli oggetti sono implicitamente puntatori all'oggetto. Quindi new funziona allo stesso modo in C++ come Java, ma non ne viene reso noto in Java. Immagino che questa sia la ragione della tua confusione.