C++:auto_ptr +转发声明?

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)