首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:auto_ptr +转发声明?

C++:auto_ptr +转发声明?
EN

Stack Overflow用户
提问于 2009-12-23 10:23:24
回答 7查看 4.6K关注 0票数 12

我有这样一门课:

代码语言:javascript
复制
class Inner;

class Cont
{
public:
    Cont();
    virtual ~Cont();
private:
    Inner* m_inner;
};

在.cpp中,构造函数使用new和析构函数delete创建一个new实例。效果很好。

现在,我想将这段代码更改为使用auto_ptr,因此我编写了:

代码语言:javascript
复制
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,这是一个巨大的麻烦,有时甚至是不可能的。这个问题通常是如何处理的?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-12-23 10:28:01

您需要将定义class Inner的头包含到Cont::~Cont()实现所在的文件中。这样,在定义class Cont的头文件中仍然有一个前向声明,编译器可以看到class Inner定义,并可以调用析构函数。

代码语言:javascript
复制
//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()
{
}
票数 13
EN

Stack Overflow用户

发布于 2011-06-06 13:10:20

结果,只有当我把C‘’tor内联时,问题才会发生。如果我把收银员放进cpp,在Inner解密后一切都好。

票数 4
EN

Stack Overflow用户

发布于 2009-12-23 10:32:12

您可以考虑使用boost::shared_ptr()。它没有实际的缺点,而不是性能,并且对转发声明更友好:

boost::shared_ptr<class NeverHeardNameBefore> ptr;

没问题,上面没有额外声明。

shared_ptr比auto_ptr做的更多,比如引用计数,但是如果您不需要它,它不应该有什么害处。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1951933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档