我目前在异常安全方面做了很多事情。 (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,我认为这是一个错误,因为现在很难看到连接。
我的编译器吐出错误:
error C2027: use of undefined type '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;
}
};
答案 0 :(得分:4)
在定义Smart_Ptr
之前,您无法编写按值返回Smart_Ptr
的函数。前瞻声明是不够的。
您链接的代码包含注释// Defined below class FredPtr {...};
,但您已在create
类定义中定义了Foo
函数。如果仔细查看“类Fred的更改将会是:”之后的代码,您将看到create
仅在类中声明:它稍后通过以下代码定义:
inline FredPtr Fred::create() { return new Fred(); }
您只需要做同样的事情。