C++;新对象 我正在学习C++,我无法理解这一点。我不想发布我所有的代码,但觉得这是必要的,因为它总体上很短 #include <iostream> #include "MathObject.h" using namespace std; int main(int args, char *argv[]){ MathObject mo = new MathObject(3,4); int sum = mo.sum(); cout << sum << endl; return 0; }
所有这些都在3个独立的文件中,我使用教授的一个示例作为模板,介绍如何创建类和头文件来组织代码。这将始终返回错误:C++;新对象 我正在学习C++,我无法理解这一点。我不想发布我所有的代码,但觉得这是必要的,因为它总体上很短 #include <iostream> #include "MathObject.h" using namespace std; int main(int args, char *argv[]){ MathObject mo = new MathObject(3,4); int sum = mo.sum(); cout << sum << endl; return 0; },c++,object,compiler-errors,C++,Object,Compiler Errors,所有这些都在3个独立的文件中,我使用教授的一个示例作为模板,介绍如何创建类和头文件来组织代码。这将始终返回错误: conversion from 'MathObject*' to non-scalar type 'MathObject' requested| ||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===| 我已经检查了代码一段时间了,但我不能得到它!如果有人能指出问题所在,我很想听 谢谢
conversion from 'MathObject*' to non-scalar type 'MathObject' requested| ||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===|
我已经检查了代码一段时间了,但我不能得到它!如果有人能指出问题所在,我很想听
谢谢 您对MathObject的声明有错误。如果要动态分配MathObject,则应
MathObject * mo = new MathObject(3,4);
应该使用->运算符调用sum函数,如下所示:
int sum = mo->sum();
或者,如果要在堆栈上创建对象,则不应使用new操作符
MathObject mo(3,4);
int sum = mo.sum();
那就行了
编辑:
下面是它在顶层的工作原理:
new运算符搜索对象的可用内存(在您的示例中是MathObject),并使用您传递的构造函数参数初始化空间中的新对象。然后,它返回一个指向这个新创建的对象的指针。所以在lhs上,您应该声明一个可以指向MathObject的指针。这就是为什么我们有MathObject*mo
而没有MathObject-mo.
我希望这有帮助 您对MathObject的声明有错误。如果要动态分配MathObject,则应
MathObject * mo = new MathObject(3,4);
应该使用->运算符调用sum函数,如下所示:
int sum = mo->sum();
或者,如果要在堆栈上创建对象,则不应使用new操作符
MathObject mo(3,4);
int sum = mo.sum();
那就行了
编辑:
下面是它在顶层的工作原理:
new运算符搜索对象的可用内存(在您的示例中是MathObject),并使用您传递的构造函数参数初始化空间中的新对象。然后,它返回一个指向这个新创建的对象的指针。所以在lhs上,您应该声明一个可以指向MathObject的指针。这就是为什么我们有MathObject*mo
而没有MathObject-mo.
我希望这有帮助在C++中,你可以在堆栈上创建一个对象:
MathObject mo(3,4);
此语句在堆栈上创建一个名为mo
的MathObject
,当main
返回时,该对象将自动销毁。这应该是您创建对象的首选方式
<> > C++ >新< /COD>运算符,与java或C语言中的<代码>新< /Calp>运算符不同,不需要创建对象,一般应非常谨慎地使用。它从堆中分配内存来保存对象,这允许对象的生存期扩展到当前函数之外。但这也意味着,在使用完对象后,您有责任使用delete
进行清理,否则内存将泄漏
MathObject *mo = new MathObject(3,4); // Never do this!
这是可怕的代码。a)效率低下(使用new
从堆中进行分配要比堆栈昂贵得多)和b)不安全,因为如果由于某种原因您未能删除mo代码>(有时原因超出您的控制范围,例如代码中抛出异常)内存泄漏
std::unique_ptr<MathObject> mo(new MathObject(3,4));
std::unique_ptr mo(新的MathObject(3,4));
这使用new
在堆上创建MathObject
对象,并将返回的指针存储在堆栈上创建的unique\ptr
对象中。当unique\u ptr
被销毁时,unique\u ptr
对象将自动删除其中存储的指针。这是安全的,但它仍然比第一个版本慢很多。C++中的< p>可以在堆栈上创建一个对象:
MathObject mo(3,4);
此语句在堆栈上创建一个名为mo
的MathObject
,当main
返回时,该对象将自动销毁。这应该是您创建对象的首选方式
<> > C++ >新< /COD>运算符,与java或C语言中的<代码>新< /Calp>运算符不同,不需要创建对象,一般应非常谨慎地使用。它从堆中分配内存来保存对象,这允许对象的生存期扩展到当前函数之外。但这也意味着,在使用完对象后,您有责任使用delete
进行清理,否则内存将泄漏
MathObject *mo = new MathObject(3,4); // Never do this!
这是可怕的代码。a)效率低下(使用new
从堆中进行分配要比堆栈昂贵得多)和b)不安全,因为如果由于某种原因您未能删除mo代码>(有时原因超出您的控制范围,例如代码中抛出异常)内存泄漏
std::unique_ptr<MathObject> mo(new MathObject(3,4));
std::unique_ptr mo(新的MathObject(3,4));
这使用new
在堆上创建MathObject
对象,并将返回的指针存储在堆栈上创建的unique\ptr
对象中。当unique\u ptr
被销毁时,unique\u ptr
对象将自动删除其中存储的指针。这是安全的,但仍然比第一个版本慢得多。这是您的对象初始化,如下所示:
MathObject mo = new MathObject(3,4);
创建一个本地对象mo
,然后在堆的某个位置创建另一个对象,然后new
返回指向它的指针。因此,您的编译器知道您想要分配一个指向mo的指针
将您的线路替换为:
MathObject mo = MathObject(3,4);
甚至:
MathObject mo(3,4);
请注意,这两种形式实际上给出了相同的结果:在这两种情况下,编译器只生成一个对象,并使用参数(3,4)调用构造函数,尽管使用了“=”运算符。要了解更多信息,请查看: 这里是您的对象初始化:
MathObject mo = new MathObject(3,4);
创建一个本地对象mo
,然后在堆的某个位置创建另一个对象,然后new
返回指向它的指针。所以你的编译器知道你想要t