2010-10-12 112 views
12

我有這樣的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 ++編譯。那是什麼意思?這裏發生了什麼?

回答

19

嘗試:

MyItem * item = new MyItem; 

但不要忘了使用之後將其刪除:

delete item; 
+0

我試過*項目。想想問題之間的空間?Linux服務器剛剛崩潰,我不得不等待它們恢復,然後才能用*和item之間的空格嘗試它。 – kralco626 2010-10-12 23:43:18

+0

@kralco:不,沒關係。你有一本介紹性的C++書嗎? – GManNickG 2010-10-13 00:03:33

+0

不,我正在上操作系統課。我已經在Java中使用了大量的編程類並使用了C#,並且仍然在廣泛地工作。然而,這些語言都不使用像C/C++這樣的指針。這只是實現一個流水線程序的大型項目的一部分,(儘管Linux內置了它)。 我已經寫完了所有的東西,我只是得到了這個錯誤。 – kralco626 2010-10-13 00:12:25

18

你混合

MyItem item; 

其在棧上分配的MyItem實例。該實例的存儲器是在封閉範圍

MyItem * item = new MyItem; 

其中在堆上分配的MyItem實例的結束時自動釋放。你會參考這種情況下使用指針,並會在需要時使用delete item完成明確釋放內存。

3

下面是編輯的代碼與右邊

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變化,你不new。你可以儘可能在棧上創建一個MyItem對象

MyItem anotherItem; 
+0

雅,但要求是我們使用新的:(。一旦大約30分鐘前崩潰的Linux服務器回來了,我會嘗試一下。 – kralco626 2010-10-13 00:13:58

4

首先,這個代碼將不能編譯,因爲你每一個成員變量聲明後和MyItem聲明和關鍵字「結構」忘了分號輸入錯誤。您的代碼應該是這樣的:

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

MyItem item = new MyItem; 

現在回答你的問題,這個代碼不工作,因爲新的運營商返回一個指針創建的對象(​​類型的值),你要轉讓這個指針到類型MyItem的變量。編譯器不允許你這樣做(因爲值和變量有不同的類型)。你應該把指針存儲到apropriate變量,像這樣:

MyItem* item = new MyItem; 

在這種情況下,你必須記住delete item以避免內存泄漏,一旦你不再需要它。

或者,您可以創建在堆棧中的對象沒有new操作。

MyItem item; 

在這種情況下,函數返回時對象不再存在;你不需要記住刪除它。