2010-10-12 22 views
12

tengo este código C++:La conversión de 'myItem *' al tipo 'myItem' no escalares solicitado

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

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

Y me da el error:

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

Compilar con g ++. Qué significa eso? ¿Y qué está pasando aquí?

Respuesta

19

Probar:

MyItem * item = new MyItem; 

Pero no se olvide de eliminarlo después de su uso:

delete item; 
+0

He intentado * artículo. pensar el espacio entre las cosas?Los servidores de Linux simplemente se bloquearon y tendré que esperar a que vuelvan a aparecer antes de que pueda probarlo con el espacio entre * y el elemento. – kralco626

+0

@kralco: No, no importa. ¿Tienes un libro introductorio de C++? – GManNickG

+0

No. Estoy tomando una clase de sistema operativo. He tomado un montón de clases de programación en Java y usé C# y sigo trabajando extensamente. sin embargo, ninguno de esos lenguajes utiliza punteros como C/C++. Esto es solo parte de un proyecto más grande con la implementación de un programa que hace pipelining (aunque Linux lo tiene incorporado). tengo todo escrito y obtengo solo este error. – kralco626

18

Usted ha mezclado

MyItem item; 

que asigna una instancia de MyItem en la pila . La memoria para la instancia se libera automáticamente al final del alcance de encerramiento

y

MyItem * item = new MyItem; 

que asigna una instancia de MyItem en el montón. Usted se referiría a esta instancia usando un puntero y sería necesario liberar explícitamente la memoria cuando haya terminado de usar delete item.

3

Aquí se edita código con los cambios mencionados en la derecha

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 

Por cierto, usted no tiene que hacer new. Puede crear un objeto posible MyItem en la pila como

MyItem anotherItem; 
+0

ya, pero el requisito es que usemos nuevo :(. Tan pronto como vuelvan a aparecer los servidores de Linux que colapsaron hace aproximadamente 30 minutos, lo probaré. – kralco626

4

En primer lugar, este código no se compilará porque se le olvidó el punto y coma después de cada declaración de variables miembro y después de MyItem declaración y la palabra clave "estructura" está escrito mal El código debería tener este aspecto:

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

MyItem item = new MyItem; 

Ahora respondiendo a su pregunta, este código no funciona debido a que el nuevo operador devuelve un puntero al objeto creado (un valor de tipo MyItem*) y que está tratando de asignar este puntero a una variable del tipo MyItem. El compilador no te permite hacer esto (porque el valor y la variable tienen diferentes tipos). Debe almacenar el puntero en una variable adecuada exploración, así:

MyItem* item = new MyItem; 

En este caso, hay que recordar a delete item para evitar la pérdida de memoria una vez que ya no lo necesita.

Como alternativa, puede crear el objeto en la pila sin el operador new.

MyItem item; 

En este caso, el objeto deja de existir cuando la función retorna; no necesita recordar borrarlo.

Cuestiones relacionadas