2012-07-09 85 views
0

我有在C++中实例化对象一个简单的问题: 如果我们假设我班有一个默认的构造函数,然后创建新的对象这样的:错误,而一个类实例化

PfAlgorithm object = new PfAlgorithm(); 

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

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

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

回答

5

new运算符返回一个指针,而不是一个值。所以,你需要写:

PfAlgorithm* object = new PfAlgorithm() 

object是一个指向新分配的PfAlgorithm对象。关于指针的一些简单的介绍性信息可以参见here。然而,正如在下面的评论中所讨论的那样,处理原始指针(由于内存泄漏的潜在问题,不明确的所有权等问题)几乎不是一个好主意。继续阅读...

在堆中分配此对象后,您需要确保在完成时删除它,否则应用程序将泄漏内存。为了简化操作,我强烈建议您考虑使用来自boost libraries(或C++ 11)的智能指针来管理您的内存。

另外,各种其他人所说,你可以简单地做:

PfAlgorithm object; 

而栈上分配的对象,而不必担心如何管理内存。

+0

这样做比所需的更复杂。丢失指针(因此是'new')。鉴于OP提供的详细程度,这只是**不是**可接受的解决方案。 – 2012-07-09 20:20:37

+0

@KonradRudolph。好。我很欣赏指针是复杂的。但是,坦率地说,你不会对C++有太多了解,而不了解它们。所以我认为另外包含一个堆栈分配(正如其他人所做的那样,正如我已经包括的那样)是完全有效的,但是断言这不是一个可接受的解决方案,而是非常极端。 – 2012-07-09 20:26:05

+0

感谢您的回复。 – user1499125 2012-07-09 20:28:21

5

你有可能在Java中比在C++中更有经验吗?

PfAlgorithm object; 

创建PfAlgorithm型蛮好的对象:与Java,C++中,你不要当你实例化一个对象需要new。当变量超出范围时,该对象会自动销毁。

1

C++区分一个对象(在你的情况下是PfAlgorithm类型)和一个指向对象的指针(PfAlgorithm *)。 new PfAlgorithm()表达式返回一个指向新分配的对象的指针。如果这是你想要的,你还必须让object有一个指针的类型:

PfAlgorithm *object = new PfAlgorithm(); 

如果你不希望使用指针,摆脱new的:

PfAlgorithm object = PfAlgorithm(); 

在第一种情况下,一旦你不再使用它,你将不得不使用delete;在第二种情况下,该对象将在退出创建它的块({...})时被销毁。没有Java或C#中的自动内存管理。