2010-09-26 38 views
2

我目前在異常安全方面做了很多事情。 (香草薩特的特殊C++,C++ FAQ精簡版等)C++ FAQ Lite Smart_Ptr類無法正常工作?

我特別想寫,理解引用計數例子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代碼的完整副本。我也按照原樣完整複製了代碼,並且收到了相同的錯誤。

末關鍵問題

的一部分,因爲我一直mistakingly思考我公佈源代碼的「足夠的」調試的問題,我一直在錯誤的結束了,我會後的休息代碼在這裏。

/* 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; 
    } 
}; 

回答

4

你不能寫一個返回值由一個Smart_Ptr功能,直到Smart_Ptr定義。前向宣言是不夠的。

您鏈接的代碼包含註釋// Defined below class FredPtr {...};,但您已在Foo類定義中定義了create函數。如果你的代碼仔細觀察之後的「更改爲Fred類是:」,你會看到create在類只宣稱:它的後面定義,通過下面的代碼:

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

所有你需要的是做同樣的事情。

+1

Smart_Ptr是否定義?看看我的代碼的其餘部分。 Smart_Ptr直接在Foo類的下面定義。常見問題的規範Fred和FredPtr類也是如此。 – IAE 2010-09-26 13:57:06

+5

說「直接定義在下面」更像是說「穩定的大門已經關閉了,馬後馬上關閉了」。它還沒有被定義在需要的地方,這是重要的。 – 2010-09-26 13:58:31

+0

好的,我明白了。我改變了這個安排,而且,我看到,我得到了同樣的錯誤,但現在是Fred對象。所以我直接在下面定義了創建函數,它起作用。這很奇怪,爲什麼呢?除了直接在所有必需的類下面定義函數之外,還有其他方法可以解決問題嗎? – IAE 2010-09-26 14:01:40