2011-02-09 115 views
0

我正在處理一個項目,其中幾個不同的對象在語義上連接在一起,我現在正在尋找讓對象互相引用的好方法。通常我會在每個對象中放入指針並將它們鏈接在一起。在這種特殊情況下,沒有堆對象(至少我不會在寫代碼的時候創建任何對象,內部可能會在另一個頁面上做什麼)。我們想出了一個想法,即有一個存儲唯一ID列表的類,並將該ID與需要知道的對象共享。引用對象的好習慣

這是一個很好的做法嗎?還有其他更好的方法來做到這一點嗎?

背景:該項目在學術背景下解決。我們並不確定知道學生或其他人對此有何貢獻。技術水平還不知道,但可能不是很高。通過不使用指針,我們至少可以確保對象不會被意外刪除或出於愚蠢。

編輯:

這導致了我一個獨特的ID的想法是我們的​​矢量的使用來存儲數據。 STL容器做的很多事情就是複製他們的容器。這就是爲什麼我不確定指針能夠正常工作。與矢量元素的簡單索引一樣,內容和/或其順序可能會改變。

+2

「我們至少可以確保物體不會被意外刪除或不會出於愚蠢」永遠不要低估愚蠢的力量。 – 2011-02-09 17:25:41

回答

1

這是很好的實踐嗎?

以我的經驗,沒有。任何一種獨特的ID垃圾只是一個必須管理的東西,並正確管理,否則你會得到各種奇怪的廢話噴塗。我曾經使用過一個產品,一旦使用了這個想法和我們錯誤的很大一部分,甚至更多的維護問題,都是由於必須記住愚蠢的ID跟蹤變量而引起的。當然,實現過程非常複雜(邊緣線瘋狂),做起來要比做的更容易,但是當你已經擁有由系統生成的唯一ID時,它仍然只是一個要處理的事情:變量的地址。

還有其他更好的方法來做到這一點嗎?

是的,使用指針。

不幸的是,沒有智能指針(我知道無論如何)都可以用來簡單地引用其他地方擁有的對象,所以現在您必須確保通過策略和文檔來執行該問題。這是一個弱點,是的,但仍然是跟蹤和ID更好的選擇,它可能同樣容易出現相同的問題和更多。

如果您對可用於此目的的智能指針感興趣,您可能會對我最新的博客條目感興趣。

0

只要使用一個指針 - 這就是他們的目的。如果您因爲某些原因需要序列化對它們的引用,則應該只使用唯一ID之類的內容。如果您只編寫不需要跨進程發送引用的代碼,請使用指針。特別是如果沒有堆對象,並且您不必考慮所有權。

0

你確實可以使用指針。

爲了防止有人刪除該實例,請將析構函數設爲私有。 這樣,實例不能被破壞。

但是,正如詹姆斯麥克奈利斯所指出的,永遠不要低估愚蠢的力量。你不能阻止某人在你的實例中調用free(ptr)或覆蓋內存。

+0

以我的經驗,我的同事和學生往往傾向於擁有關於C++的基本知識,但對軟件設計或基礎機制知識有限。這意味着他們知道'刪除',但不知道'免費'。 – DaClown 2011-02-09 17:52:20

1

對向量的修改可能會使向量中的任何指向對象的指針無效。您應該避免創建長期存在的指向內容的指針。

將智能指針存儲在向量中可能會更好。