Запрошено преобразование myItem * в нескалярный тип myItem - PullRequest
20 голосов
/ 13 октября 2010

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

#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 ++.Что это значит?И что здесь происходит?

Ответы [ 4 ]

29 голосов
/ 13 октября 2010

Попробуйте:

MyItem * item = new MyItem;

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

delete item;
22 голосов
/ 13 октября 2010

Вы смешали

MyItem item;

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

и

MyItem * item = new MyItem;

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

потребуется явно освободить память.
6 голосов
/ 22 августа 2012

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

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

MyItem item = new MyItem;

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

MyItem* item = new MyItem;

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

Кроме того, вы можете создать объект в стеке без оператора new.

MyItem item;

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

3 голосов
/ 13 октября 2010

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

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;
...