sho*_*osh 12 c++ pointers memory-management auto-ptr shared-ptr
我有一个这样的课:
class Inner;
class Cont
{
public:
Cont();
virtual ~Cont();
private:
Inner* m_inner;
};
Run Code Online (Sandbox Code Playgroud)
在.cpp中,构造函数创建了一个Innerwith new和析构函数delete的实例.这工作得很好.
现在我想更改此代码以便使用,auto_ptr所以我写道:
class Inner;
class Cont
{
public:
Cont();
virtual ~Cont();
private:
std::auto_ptr<Inner> m_inner;
};
Run Code Online (Sandbox Code Playgroud)
现在,构造函数初始化了auto_ptr,而析构函数什么都不做.
但它不起作用.当我实例化这个类时,问题似乎就出现了.我收到这个警告:
警告C4150:删除指向不完整类型'Inner'的指针; 没有破坏者叫
好吧,这显然非常糟糕,我明白为什么会发生这种情况,编译器不知道Inner实例化模板的时候auto_ptr<Inner>
所以我的问题:是否有一种方法可以使用auto_ptr前向声明,就像我在仅使用普通指针的版本中所做的那样?我
必须向#include每个班级宣布一个指针是一个巨大的麻烦,有时候,这是不可能的.这个问题通常是如何处理的?
sha*_*oth 13
您需要将头定义class Inner包含在Cont::~Cont()实现所在的文件中.这样,你仍然在teh头定义中有一个前向声明,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()
{
}
Run Code Online (Sandbox Code Playgroud)