web-dev-qa-db-ja.com

「myItem *」から非スカラー型「myItem」への変換が要求されました

私はこの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 ++でコンパイルします。どういう意味ですか?そして、ここで何が起こっていますか?

20
kralco626

試してください:

MyItem * item = new MyItem;

ただし、使用後に削除することを忘れないでください。

delete item;
29
tibur

あなたは混ぜました

MyItem item;

MyItemのインスタンスをスタックに割り当てます。インスタンスのメモリは、囲んでいるスコープの終わりに自動的に解放されます

そして

MyItem * item = new MyItem;

ヒープ上のMyItemのインスタンスを割り当てます。ポインタを使用してこのインスタンスを参照し、delete itemの使用が終了したときに明示的にメモリを解放する必要があります。

22
Nick Meyer

まず、各メンバー変数宣言の後、MyItem宣言の後、セミコロンを忘れてしまい、キーワード「struct」が間違って入力されたため、このコードはコンパイルされません。コードは次のようになります。

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

MyItem item = new MyItem;

あなたの質問に答えると、new演算子は作成されたオブジェクトへのポインタを返すため、このコードは機能しません(タイプMyItem*)このポインタをMyItem型の変数に割り当てようとしています。コンパイラーはこれを行うことを許可しません(値と変数の型が異なるため)。次のように、ポインタを適切な変数に保存する必要があります。

MyItem* item = new MyItem;

この場合、delete item不要になったらメモリリークを回避します。

または、new演算子を使用せずにスタック内にオブジェクトを作成できます。

MyItem item;

この場合、関数が戻るとオブジェクトは存在しなくなります。削除することを覚えておく必要はありません。

6
Leonardo Raele

以下は、右側に記載されている変更を加えた編集済みのコードです。

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

ところで、あなたはする必要があります do newしません。次のように、スタック上にMyItemオブジェクトを作成できます。

MyItem anotherItem;
3
Arun