Подтвердить что ты не робот

Преобразование из 'myItem *' в нескалярный тип 'myItem' запрошен

У меня есть код С++:

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

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

И я получаю сообщение об ошибке:

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

Компиляция с g++. Что это значит? И что здесь происходит?

4b9b3361

Ответ 1

Try:

MyItem * item = new MyItem;

Но не забудьте удалить его после использования:

delete item;

Ответ 2

Вы смешали

MyItem item;

который выделяет экземпляр MyItem в стеке. Память для экземпляра автоматически освобождается в конце охватывающей области

и

MyItem * item = new MyItem;

который выделяет экземпляр MyItem в куче. Вы бы указали на этот экземпляр, указав указатель и потребовали бы явно освободить память, когда закончите с помощью delete item.

Ответ 3

Прежде всего, этот код не будет компилироваться, потому что вы забыли полуколоны после объявления каждой членской переменной и после объявления MyItem, а ключевое слово "struct" набрано неправильно. Ваш код должен выглядеть так:

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

MyItem item = new MyItem;

Теперь, отвечая на ваш вопрос, этот код не работает, потому что новый оператор возвращает указатель на созданный объект (значение типа MyItem*), и вы пытаетесь присвоить этот указатель переменной типа MyItem. Компилятор не позволяет вам это делать (потому что значение и переменная имеют разные типы). Вы должны сохранить указатель в подходящую переменную, например:

MyItem* item = new MyItem;

В этом случае вы должны помнить delete item, чтобы избежать утечки памяти, если вам это больше не нужно.

В качестве альтернативы вы можете создать объект в стеке без оператора new.

MyItem item;

В этом случае объект перестает существовать, когда функция возвращается; вам не нужно будет его удалять.

Ответ 4

Здесь отредактированный код с изменениями, указанными справа

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

Кстати, вам не нужно делать new. Вы можете создать объект MyItem в стеке как

MyItem anotherItem;