web-dev-qa-db-fra.com

Conversion de 'myItem *' en type non scalaire 'myItem' demandée

J'ai ce code C++:

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

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

Et je reçois l'erreur:

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

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

20
kralco626

Essayer:

MyItem * item = new MyItem;

Mais n'oubliez pas de le supprimer après utilisation:

delete item;
29
tibur

Vous avez mélangé

MyItem item;

qui alloue une instance de MyItem sur la pile. La mémoire de l'instance est automatiquement libérée à la fin de la portée englobante

et

MyItem * item = new MyItem;

qui alloue une instance de MyItem sur le tas. Vous feriez référence à cette instance à l'aide d'un pointeur et seriez tenu de libérer explicitement la mémoire lorsque vous avez terminé d'utiliser delete item.

22
Nick Meyer

Tout d'abord, ce code ne sera pas compilé car vous avez oublié les points-virgules après chaque déclaration de variable membre et après la déclaration MyItem et le mot clé "struct" est mal tapé. Votre code devrait ressembler à ceci:

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

MyItem item = new MyItem;

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

MyItem* item = new MyItem;

Dans ce cas, vous devez vous rappeler de delete item pour éviter les fuites de mémoire une fois que vous n'en avez plus 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 revient; vous n'avez pas besoin de vous souvenir de le supprimer.

6
Leonardo Raele

Voici le code édité avec les changements mentionnés à droite

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 n'avez pas devez faire new. Vous pouvez éventuellement créer un objet MyItem sur la pile comme

MyItem anotherItem;
3
Arun