实例化类时出错

时间:2012-07-09 20:13:52

标签: c++ object instantiation

我有一个关于在C ++中实例化对象的简单问题: 如果我们假设我的类有一个默认构造函数,那么我就像这样创建新对象:

PfAlgorithm object = new PfAlgorithm();

但是当我跑步时我得到了这个错误:

conversion from ‘PfAlgorithm*’ to non-scalar type ‘ns3::PfAlgorithm’ requested

有人可以向我解释这个错误的原因吗? 非常感谢你。

3 个答案:

答案 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#中的自动内存管理。