gpt4 book ai didi

C++ FAQ Lite Smart_Ptr 类不工作?

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:27 25 4
gpt4 key购买 nike

我目前正在做很多关于异常安全的事情。 (Herb Sutter 的 Exceptional C++、C++ FAQ Lite 等)

特别是,我想编写并理解 C++ FAQ Lite 的引用计数示例,但我目前停留在这部分代码上:

class Smart_Ptr;

class Foo
{
private:
friend class Smart_Ptr;
unsigned int count_;

public:
static Smart_Ptr create() // Error here.
{
return new Foo();
}

private:
Foo()
: count_(0)
{ }

/* ... */
/* Smart_Ptr class initialized down here */

如您所见,我正在尝试使用 Named Constructor Idiom强制用户不要创建我的 Foo 对象的局部变量。本质上,这正是 C++ FAQ 中所写的内容;我只是将 Fred 更改为 Foo,将 FredPtr 更改为 Smart_Ptr,我意识到这是一个错误,因为现在更难看出连接。

我的编译器吐出错误:

错误 C2027:使用了未定义类型“Smart_Ptr”

我不太确定这是为什么。 Smart_Ptr 已完全定义并且是 FAQ 代码的完整拷贝。我也照原样完整复制了代码,但收到了同样的错误。

结束问题的关键部分

由于我一直错误地认为我发布了“足够”的源代码来调试问题,但我一直以错误告终,所以我将在此处发布其余代码。

/* Foo.h */
class Smart_Ptr;

class Foo
{
private:
friend class Smart_Ptr;
unsigned int count_;

public:
static Smart_Ptr create()
{
return new Foo();
}

private:
Foo()
: count_(0)
{ }
};

class Smart_Ptr
{
private:
Foo *p_; // p_ is NEVER null

public:
Foo *operator-> () { return p_; }
Foo& operator* () { return *p_; }

Smart_Ptr(Foo *p)
: p_(p)
{
++p_->count_;
}

~Smart_Ptr()
{
if (--p_->count_ == 0)
delete p_;
}

Smart_Ptr(Smart_Ptr const& p)
: p_(p.p_)
{
++p_->count_;
}

Smart_Ptr& operator= (Smart_Ptr const& p)
{
Foo *const old = p_;
p_ = p.p_;
++p_->count_;

if (--old->count_ == 0)
delete old;

return *this;
}
};

最佳答案

您不能编写返回 Smart_Ptr 的函数按值,直到 Smart_Ptr被定义为。预先声明是不够的。

您链接到的代码包含注释,// Defined below class FredPtr {...}; , 但你已经定义了 create Foo 中的函数类定义。如果您仔细查看“对类 Fred 的更改将是:”之后的代码,您会看到 create。仅在类中声明:稍后通过以下代码定义:

inline FredPtr Fred::create()             { return new Fred(); }

您只需做同样的事情。

关于C++ FAQ Lite Smart_Ptr 类不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3798076/

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