Ответ 1
Try:
MyItem * item = new MyItem;
Но не забудьте удалить его после использования:
delete item;
У меня есть код С++:
#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++. Что это значит? И что здесь происходит?
Try:
MyItem * item = new MyItem;
Но не забудьте удалить его после использования:
delete item;
Вы смешали
MyItem item;
который выделяет экземпляр MyItem
в стеке. Память для экземпляра автоматически освобождается в конце охватывающей области
и
MyItem * item = new MyItem;
который выделяет экземпляр MyItem
в куче. Вы бы указали на этот экземпляр, указав указатель и потребовали бы явно освободить память, когда закончите с помощью delete item
.
Прежде всего, этот код не будет компилироваться, потому что вы забыли полуколоны после объявления каждой членской переменной и после объявления MyItem
, а ключевое слово "struct" набрано неправильно. Ваш код должен выглядеть так:
struct MyItem
{
var value;
MyItem* nextItem;
};
MyItem item = new MyItem;
Теперь, отвечая на ваш вопрос, этот код не работает, потому что новый оператор возвращает указатель на созданный объект (значение типа MyItem*
), и вы пытаетесь присвоить этот указатель переменной типа MyItem
. Компилятор не позволяет вам это делать (потому что значение и переменная имеют разные типы). Вы должны сохранить указатель в подходящую переменную, например:
MyItem* item = new MyItem;
В этом случае вы должны помнить delete item
, чтобы избежать утечки памяти, если вам это больше не нужно.
В качестве альтернативы вы можете создать объект в стеке без оператора new
.
MyItem item;
В этом случае объект перестает существовать, когда функция возвращается; вам не нужно будет его удалять.
Здесь отредактированный код с изменениями, указанными справа
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;