2012-12-05 77 views
0

我不確定這是否可能。防止在堆棧上創建類的層次結構

我需要防止派生自X的所有類被實例化爲本地堆棧或成員變量。我將所有的析構函數都保護起來,並且就外部範圍而言,這個技巧已經實現了。但是我需要阻止它們自己實例化。我的意思是,如果Y具有類型Z的成員變量或在其方法中實例化Z類型的局部變量,那麼它不會削減它。

現在我可以在層次結構樹的所有樹葉中創建私有析構函數,但問題是每個不應該被允許成爲(堆)變量。在X < - Y < - Z的情況下,所有三個都應該實例化,但X和Y不能有私有析構函數。此外,即使這並沒有阻止我在Z方法中使用局部變量Z類型。

我猜他們的構造函數是私有的,並且添加操作符new作爲朋友,它們都可以做到這一點,但這是很多額外的工作(因爲我們使用幾個新的操作符版本)並且層次很大。

那麼,有沒有一種方法有一個(最好)編譯時,或這些對象的堆棧實例化的運行時錯誤,而不訴諸私人構造 - 朋友新路?

<編輯> 事情是這個項目的以前的程序員寫了大量的代碼,並且這個層次結構中的所有類都有非常複雜的析構函數。而且,作者在這些破壞者中不分青紅皁白地稱爲虛擬方法,這導致了很多(對他們)無法解釋的崩潰和內存破壞。現在將所有析構函數轉換爲obj->Release()模式,並且在最上面的版本中我有delete this。顯然這不適用於堆棧對象,現在我介紹了一些自己的崩潰。另外我有點短的時間和運行/等待崩潰/解決這個特定崩潰方法是非常非常慢 < /編輯>

+0

我認爲變量的位置取決於你如何聲明它? –

+0

一個對象通常不應該在乎它的存儲方式。這違反了單一職責的習慣用法。你所要求的是對語言的嚴重濫用,所以我不希望一個答案是美麗的。 –

回答

0

在他的著作「更有效的C++」中第27項,斯科特邁爾斯(順便說一下,我最喜歡的C++作者)描述了爲什麼在一般意義上以及在便攜式或半便攜式C++的範圍內不可能明確區分對象是在堆棧,堆中分配還是靜態分配。它還討論了確保只能在堆棧或堆上分配對象的各種選項。其中一個或多或少是可行的,另一個不具備真正便攜式的萬無一失的工作方式;我忘記哪個是哪個。 (書在工作,我在家。)