我有一个关于在C ++中实例化对象的简单问题: 如果我们假设我的类有一个默认构造函数,那么我就像这样创建新对象:
PfAlgorithm object = new PfAlgorithm();
但是当我跑步时我得到了这个错误:
conversion from ‘PfAlgorithm*’ to non-scalar type ‘ns3::PfAlgorithm’ requested
有人可以向我解释这个错误的原因吗? 非常感谢你。
答案 0 :(得分:5)
new
运算符返回指针,而不是值。所以你需要写:
PfAlgorithm* object = new PfAlgorithm()
其中object
是指向新分配的PfAlgorithm对象的指针。可以找到关于指针的一些简单的介绍性信息here。但是正如下面的评论中所讨论的那样,处理原始指针几乎从来都不是一个好主意(由于内存泄漏的潜在问题,所有权模糊等问题)。请继续阅读...
在堆上分配了这个对象后,你需要确保在完成它时删除它,否则你的应用程序将泄漏内存。为了使这更容易,我强烈重新考虑你也考虑使用boost libraries(或从C ++ 11)中的智能指针来管理你的记忆。
或者,正如其他人所建议的那样,您可以这样做:
PfAlgorithm object;
并在堆栈上分配您的对象,而不必担心管理内存。
答案 1 :(得分:5)
您是否有可能在Java方面比在C ++方面更有经验?与Java不同,在C ++中,当您实例化对象时,不需要new
:
PfAlgorithm object;
创建一个PfAlgorithm
类型的对象就好了。当变量超出范围时,该对象将自动销毁。
答案 2 :(得分:1)
C ++区分对象(在您的情况下为PfAlgorithm类型)和指向对象的指针(PfAlgorithm *)。
new PfAlgorithm()
表达式返回指向新分配对象的指针。如果这是您想要的,您还必须使object
具有指针类型:
PfAlgorithm *object = new PfAlgorithm();
如果您不想使用指针,请删除new
:
PfAlgorithm object = PfAlgorithm();
在第一种情况下,一旦你不再使用它,你将不得不delete
你的对象;在第二种情况下,对象将在从创建它的块({...}
)退出时被销毁。没有Java或C#中的自动内存管理。