2010-10-12 8 views
12

J'ai ce code C++:Conversion de 'MyItem * type non scalaire 'MyItem' demandé

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

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

Et j'obtiens l'erreur:

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

Compiler avec g ++. Qu'est-ce que ça veut dire? Et que se passe-t-il ici?

Répondre

19

Essayez:

MyItem * item = new MyItem; 

Mais ne pas oublier de le supprimer après utilisation:

delete item; 
+0

J'ai essayé * article. penser l'espace entre les questions?Les serveurs Linux viennent de tomber en panne, je vais devoir attendre qu'ils reviennent avant que je puisse l'essayer avec l'espace entre * et item. – kralco626

+0

@kralco: Non, ce n'est pas grave. Avez-vous un livre d'introduction en C++? – GManNickG

+0

Non, je prends une classe de systèmes d'exploitation. J'ai pris une tonne de cours de programmation en Java et utilisé C# et toujours au travail. Cependant, aucune de ces langues n'utilise des pointeurs comme C/C++. Cela fait partie d'un projet plus vaste avec l'implémentation d'un programme qui fait pipelining (même si Linux l'a intégré). J'ai tout écrit et j'obtiens cette erreur. – kralco626

18

Vous avez mélangé

MyItem item; 

qui attribue une instance de MyItem sur la pile . La mémoire de l'instance est automatiquement libéré à la fin du champ d'enceinte

et

MyItem * item = new MyItem; 

qui alloue une instance de MyItem sur le tas. Vous devez vous référer à cette instance en utilisant un pointeur et serait nécessaire pour libérer explicitement la mémoire lorsque vous avez fini d'utiliser delete item.

3

code est modifié avec des changements mentionnés sur le droit

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, vous ne ont à fairenew. Vous pouvez possible de créer un objet MyItem sur la pile comme

MyItem anotherItem; 
+0

ya, mais l'exigence est que nous utilisons de nouvelles :(Dès que les serveurs Linux qui tombent en panne il y a environ 30 minutes reviennent, je vais essayer. – kralco626

4

Tout d'abord, ce code ne compile pas parce que vous avez oublié les points-virgules après chaque déclaration de variable membre et après MyItem déclaration et le mot-clé « struct » est mal typé. Votre code devrait ressembler à ceci:

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

MyItem item = new MyItem; 

maintenant répondre à votre question, ce code ne fonctionne pas parce que le nouvel opérateur renvoie un pointeur sur l'objet créé (une valeur de type MyItem*) et que vous essayez d'attribuer ce pointeur à une variable de type MyItem. Le compilateur ne vous permet pas de faire cela (parce que la valeur et la variable ont des types différents). Vous devez stocker le pointeur dans une variable winrar, comme ceci:

MyItem* item = new MyItem; 

Dans ce cas, vous devez vous rappeler de delete item pour éviter la fuite de la mémoire une fois que vous ne avez besoin.

Vous pouvez également créer l'objet dans la pile sans l'opérateur new.

MyItem item; 

Dans ce cas, l'objet cesse d'exister lorsque la fonction retourne; vous n'avez pas besoin de vous souvenir de le supprimer.