C ++ FAQ Lite Smart_Ptr类不起作用?

时间:2010-09-26 13:50:58

标签: c++ smart-pointers

我目前在异常安全方面做了很多事情。 (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;
    }
};

1 个答案:

答案 0 :(得分:4)

在定义Smart_Ptr之前,您无法编写按值返回Smart_Ptr的函数。前瞻声明是不够的。

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

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

您只需要做同样的事情。