2011-03-22 36 views
1

我要安排這樣的事情,對於一個類Foo,這個工程:如何定義只能通過新實例化的類(即不在堆棧上)?

Foo *f = new Foo() 

但這並不(最好是編譯時錯誤):

Foo f; 

可以這樣做?

具體的原因是Foo實際上是一個跟蹤類,使另一個堆分配對象出現在腳本環境中。 Foo的內部部件保持從腳本引用到C++對象的映射。追蹤被攝體會像這樣使用:

Thing *t = new Thing(); 
(new FooThing(t))->PushToScriptStack(); 

如果跟蹤對象是在棧上然後將鼠標指針變爲範圍的結束無效的,我留下了我的跟蹤數據懸擺指針。

我有這一切運作良好,我只是尋找一點額外的保護。

回答

5

使構造函數爲私有的,有一個create()會在堆上分配一個對象的實例並返回一個指針。你將不得不自己處理釋放。

對於如:

Foo *f = Foo::create(); 

及更高版本:

Foo::destroy(f); 
+0

,當你使用它的另一個對象裏面是什麼。現在只能用指針表示。即使這個對象在堆上。 – 2011-03-22 01:40:58

+0

好點。幸運的是,這不是我需要在這種情況下。 – 2011-03-22 01:43:46

+0

@羅伯特諾里斯:我寧願用Foo :: destroy(f);以確保對象不會自行刪除(因爲這可能會導致問題)。 – 2011-03-22 01:48:10

2

我知道你已經接受了答案,但無論如何...

這是覆蓋在項目27 Scott Meyer的更有效的C++。

他說你可以通過將構造函數設爲私有來實現,但這可能有點麻煩,因爲你必須確保所有構造函數都是私有的。除了可能會添加一個新的構造函數並忘記將其設置爲私有的外,還必須考慮編譯器生成的構造函數。梅耶斯認爲,將析構函數設爲私有是比較容易的,因爲只能有這些屬性,但當然這有其自身的含義。

如果你不已經擁有了它,我衷心推薦這本書(我想任何事情的邁爾斯寫的。)

+0

在這種情況下,備用「構造函數」和私有析構函數是合適的。這個班有一個非常特殊的目的,不打算分類。我確實看到你的觀點。感謝您的建議;我聽說過這本書,但還沒有讀它。我馬上去追查一下。 – 2011-03-22 09:31:57

相關問題