我有一個GUI來與用戶交互,但是我有這樣的OOP設計問題。OOP設計問題(MFC C++實現)
通過對話框,用戶指定CDiscreteDistribution
s,並將它們存儲在MyAppDoc
類的std::vector<CDiscreteDistribution*>
中用於序列化。通過另一個對話框,用戶爲特定的CParameter
選擇一種類型CDistribution
。 CDiscreteDistribution
,CConstantDistribution
和CContinuousDistribution
繼承CDistribution
和CParameter
具有指向CDistribution
成員變量的多態指針。 MyAppDoc
有一個容器類CParameter
。因此CDiscreteDistribution
s被指出兩次,但只存在一次。
總之,MyAppDoc
具有
std::vector<CDiscreteDistribution*>
CContainer
其中有許多CParameter
具有CDistribution*
其可以指向的CDiscreteDistribution
其是存儲在CDiscreteDistribution*
S的一個一個以上CConstantDistribution
通過CParameter
CContinuousDistribution
創建創建/銷燬/由CParameter
這種設計模式破壞是造成我不同噩夢在移植應用程序使用shared_ptr
由於雙刪除和系列化(促進)。如果其中一個指向CDiscreteDistribution
的指針是weak_ptr
?如果是的話,應該在哪裏擁有指針?
感謝您的幫助!
編輯: 我重新思考推理具有std::vector<CDiscreteDistribution*>
,它只是避免載體複製進入和退出的GUI。但是這些對象非常小,所以我打破了它們之間的聯繫,並且遭受了較小的性能影響。現在MyAppDoc
有:
std::vector<CDiscreteDistribution>
CContainer
其中有許多CParameter
具有CDistribution*
它可以指向一個CDiscreteDistribution
創建/CParameter
破壞,從CDiscreteDistribution
S的一個拷貝存儲在 以上
CConstantDistribution
創建/銷燬CParameter
CContinuousDistribution
創建/CParameter
毀滅,那麼我認爲問題的一部分是boost::serialization
每個CDiscreteDistribution
那些不知道對方的存在了兩個shared_ptr
秒。現在唯一的問題是向後兼容以前版本創建的文件。
我認爲這個'解決方案'實際上只是避免了一個適當的設計!
它可能會幫助你簡化或一般化您的具體情況一點。你可以把它變成更多的'Base' /'Derived'抽象例子來演示你的共享指針/等問題是什麼?我覺得很難用書面真正知道什麼之類的問題,對你正在運行了問題... – HostileFork
感謝叉先生,你是對的,但我會離開它,因爲其他的反應已經使用了相同的命名法。 – Colin