转换请求
我有这样的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;
你混合
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;
雅,但要求是我们使用新的:(。一旦大约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;
在这种情况下,函数返回时对象不再存在;你不需要记住删除它。
我试过*项目。想想问题之间的空间?Linux服务器刚刚崩溃,我不得不等待它们恢复,然后才能用*和item之间的空格尝试它。 – kralco626 2010-10-12 23:43:18
@kralco:不,没关系。你有一本介绍性的C++书吗? – GManNickG 2010-10-13 00:03:33
不,我正在上操作系统课。我已经在Java中使用了大量的编程类并使用了C#,并且仍然在广泛地工作。然而,这些语言都不使用像C/C++这样的指针。这只是实现一个流水线程序的大型项目的一部分,(尽管Linux内置了它)。 我已经写完了所有的东西,我只是得到了这个错误。 – kralco626 2010-10-13 00:12:25