转换请求

问题描述:

我有这样的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 ++编译。那是什么意思?这里发生了什么?

尝试:

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

你混合

MyItem item; 

其在栈上分配的MyItem实例。该实例的存储器是在封闭范围

MyItem * item = new MyItem; 

其中在堆上分配的MyItem实例的结束时自动释放。你会参考这种情况下使用指针,并会在需要时使用delete 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 

提到BTW变化,你不new。你可以尽可能在栈上创建一个MyItem对象

MyItem anotherItem; 
+0

雅,但要求是我们使用新的:(。一旦大约30分钟前崩溃的Linux服务器回来了,我会尝试一下。 – kralco626 2010-10-13 00:13:58

首先,这个代码将不能编译,因为你每一个成员变量声明后和MyItem声明和关键字“结构”忘了分号输入错误。您的代码应该是这样的:

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

MyItem item = new MyItem; 

现在回答你的问题,这个代码不工作,因为新的运营商返回一个指针创建的对象(​​类型的值),你要转让这个指针到类型MyItem的变量。编译器不允许你这样做(因为值和变量有不同的类型)。你应该把指针存储到apropriate变量,像这样:

MyItem* item = new MyItem; 

在这种情况下,你必须记住delete item以避免内存泄漏,一旦你不再需要它。

或者,您可以创建在堆栈中的对象没有new操作。

MyItem item; 

在这种情况下,函数返回时对象不再存在;你不需要记住删除它。