gpt4 book ai didi

C++:auto_ptr + 前向声明?

转载 作者:IT老高 更新时间:2023-10-28 23:11:42 27 4
gpt4 key购买 nike

我有这样的课:

class Inner;

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

在 .cpp 中,构造函数创建 Inner 的实例与 new和析构函数 delete它。这工作得很好。
现在我想更改此代码以使用 auto_ptr所以我写:

class Inner;

class Cont
{
public:
Cont();
virtual ~Cont();
private:
std::auto_ptr<Inner> m_inner;
};

现在,构造函数初始化了 auto_ptr而析构函数什么也不做。

但它不起作用。当我实例化这个类时,问题似乎出现了。我收到此警告:

warning C4150: deletion of pointer to incomplete type 'Inner'; no destructor called

嗯,这显然很糟糕,我理解它为什么会发生,编译器不知道 Inner 的 d'tor实例化auto_ptr<Inner>的模板时

所以我的问题是:有没有办法使用 auto_ptr像我在只使用普通指针的版本中那样使用前向声明?
不得不#include我声明一个指向的每个类都是一个巨大的麻烦,有时甚至是不可能的。这个问题一般是怎么处理的?

最佳答案

您需要将定义 class Inner 的 header 包含到 Cont::~Cont() 实现所在的文件中。这样,您在定义 class Cont 的 header 中仍然有一个前向声明,并且编译器会看到 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()
{
}

关于C++:auto_ptr + 前向声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1951933/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com