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++;新对象 我正在学习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) ===| 我已经检查了代码一段时间了,但我不能得到它!如果有人能指出问题所在,我很想听 谢谢

所有这些都在3个独立的文件中,我使用教授的一个示例作为模板,介绍如何创建类和头文件来组织代码。这将始终返回错误:

  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.


我希望这有帮助
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