2010-10-12 2 views
12

Ho questo codice C++:La conversione da 'myItem *' per non scalare di tipo 'myItem' richiesto

#include <iostream> 
using namespace std; 
struct MyItem 
{ 
    int value; 
    MyItem* nextItem; 
}; 

int main() { 
    MyItem item = new MyItem; 
    return 0; 
} 

E io ottenere l'errore:

error: conversion from `MyItem*' to non-scalar type `MyItem' requested 

compilazione con g ++. Cosa significa? E cosa sta succedendo qui?

risposta

19

Prova:

MyItem * item = new MyItem; 

Ma non dimenticare di eliminarlo dopo l'uso:

delete item; 
+0

Ho provato * articolo. pensa lo spazio tra le cose?I server Linux si sono bloccati e dovrò aspettare che tornino prima che io possa provarlo con lo spazio tra * e l'elemento. – kralco626

+0

@kralco: No, non importa. Hai un libro introduttivo in C++? – GManNickG

+0

No. Sto prendendo una classe di sistemi operativi. Ho preso un sacco di lezioni di programmazione in Java e ho usato C# e sono ancora molto al lavoro. tuttavia nessuna di queste lingue usa puntatori come C/C++. Questo è solo parte di un progetto più ampio con l'implementazione di un programma che esegue il pipelining, (anche se Linux lo ha integrato). ho scritto tutto e ottengo solo questo errore. – kralco626

18

Hai mescolato

MyItem item; 

che assegna un'istanza MyItem sullo stack . La memoria per l'istanza viene liberato automaticamente alla fine dell'ambito racchiude

e

MyItem * item = new MyItem; 

che assegna un'istanza MyItem sul mucchio. Si farebbe riferimento a questa istanza utilizzando un puntatore e sarebbe necessario liberare esplicitamente la memoria al termine dell'utilizzo di delete item. Non

3

Qui viene editato codice con cambiamenti menzionati a destra

struct MyItem     // corrected spelling struct 
{ 
    var value;     // added ; 
    struct MyItem * nextItem; // add "struct" and added ; 
};        // added ; 

MyItem * item = new MyItem; // added * before item 

delete item;     // not exactly here, but some where in your code 

BTW, non hanno a che farenew. È possibile creare un oggetto MyItem in pila come

MyItem anotherItem; 
+0

ya, ma il requisito è che usiamo nuovo :(. Non appena i server linux che si arrestano in modo anomalo circa 30 minuti fa tornano, proverò. – kralco626

4

Prima di tutto, questo codice non verrà compilato perché si è dimenticato i punti e virgola dopo ogni dichiarazione di variabile membro e dopo MyItem dichiarazione e la parola chiave "struct" è stato errato. Il codice dovrebbe essere simile a questa:

struct MyItem 
{ 
var value; 
MyItem* nextItem; 
}; 

MyItem item = new MyItem; 

Ora rispondere alla tua domanda, questo codice non funziona perché l'operatore new restituisce un puntatore all'oggetto creato (un valore di tipo MyItem*) e si sta tentando di assegnare questo puntatore a una variabile di tipo MyItem. Il compilatore non ti permette di farlo (perché il valore e la variabile hanno tipi diversi). È necessario memorizzare il puntatore in una variabile apropriate, in questo modo:

MyItem* item = new MyItem; 

In questo caso, è necessario ricordarsi di delete item per evitare perdita di memoria una volta che non è più necessario.

In alternativa, è possibile creare l'oggetto nello stack senza l'operatore new.

MyItem item; 

In questo caso, l'oggetto cessa di esistere al ritorno della funzione; non è necessario ricordarsi di eliminarlo.