我目前在異常安全方面做了很多事情。 (香草薩特的特殊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;
}
};
Smart_Ptr是否定義?看看我的代碼的其餘部分。 Smart_Ptr直接在Foo類的下面定義。常見問題的規範Fred和FredPtr類也是如此。 – IAE 2010-09-26 13:57:06
說「直接定義在下面」更像是說「穩定的大門已經關閉了,馬後馬上關閉了」。它還沒有被定義在需要的地方,這是重要的。 – 2010-09-26 13:58:31
好的,我明白了。我改變了這個安排,而且,我看到,我得到了同樣的錯誤,但現在是Fred對象。所以我直接在下面定義了創建函數,它起作用。這很奇怪,爲什麼呢?除了直接在所有必需的類下面定義函數之外,還有其他方法可以解決問題嗎? – IAE 2010-09-26 14:01:40