我有这样一门课:
class Inner;
class Cont
{
public:
Cont();
virtual ~Cont();
private:
Inner* m_inner;
};在.cpp中,构造函数使用new和析构函数delete创建一个new实例。效果很好。
现在,我想将这段代码更改为使用auto_ptr,因此我编写了:
class Inner;
class Cont
{
public:
Cont();
virtual ~Cont();
private:
std::auto_ptr<Inner> m_inner;
};现在,构造函数初始化了auto_ptr,析构函数什么也不做。
但不起作用。当我实例化这个类时,似乎出现了这个问题。我收到警告:
警告C4150:删除指向不完整类型‘Inner’的指针;没有调用析构函数
这显然很糟糕,我理解为什么会发生这种情况,编译器在实例化Inner模板时不知道auto_ptr<Inner>的d‘’tor
那么,我的问题是:是否有一种方法可以像我在只使用普通指针的版本中一样,将auto_ptr与前向声明一起使用?
我声明指向的每个类都必须#include,这是一个巨大的麻烦,有时甚至是不可能的。这个问题通常是如何处理的?
发布于 2009-12-23 10:28:01
您需要将定义class Inner的头包含到Cont::~Cont()实现所在的文件中。这样,在定义class Cont的头文件中仍然有一个前向声明,编译器可以看到class Inner定义,并可以调用析构函数。
//Cont.h
class Inner; // is defined in Inner.h
class Cont
{
virtual ~Cont();
std::auto_ptr<Inner> m_inner;
};
// Cont.cpp
#include <Cont.h>
#include <Inner.h>
Cont::~Cont()
{
}发布于 2011-06-06 13:10:20
结果,只有当我把C‘’tor内联时,问题才会发生。如果我把收银员放进cpp,在Inner解密后一切都好。
发布于 2009-12-23 10:32:12
您可以考虑使用boost::shared_ptr()。它没有实际的缺点,而不是性能,并且对转发声明更友好:
boost::shared_ptr<class NeverHeardNameBefore> ptr;
没问题,上面没有额外声明。
shared_ptr比auto_ptr做的更多,比如引用计数,但是如果您不需要它,它不应该有什么害处。
https://stackoverflow.com/questions/1951933
复制相似问题