說我有一個具有Initialize()方法的類型A的對象。 該方法接收對象B,這些對象保留爲對象數據成員。 B對象在多個對象之間共享,因此A應該包含最初接收的B對象而不是其副本。通過引用或指針共享對象
class A
{
public:
bool Initialize(B?? b);
private:
B?? m_B;
}
對象B必須存在。因此,我認爲通過引用傳遞它,而不是傳遞指針,如果B爲NULL,則失敗Initialize()。
m_B的唯一代名詞是指針B的類型(它不能作爲B的引用,因爲B的初始化並不是在A c-tor中完成的)。因此,初始化應該看起來像:
bool A::Initialize(B& b)
{
m_B = &b;
....
}
這樣可以嗎?
UPD:
的代碼是不是新的,我只是想 「修理」 的一些問題。 其實我不是在談論一些具體的A和B類,而是關於在我的代碼庫中接近問題的一種方式。代碼廣泛傳遞指向B的指針,並在Initialize()中驗證它是否爲NULL。
將B傳遞給A的C-tor並不總是一個好的選擇。還有其他參數傳遞給A,在A創建時不存在。因此,我不想將部分參數傳遞給A-tor,其餘部分傳遞給A :: Initialize()。
shared_ptr也可以是「NULL」,因此將它傳遞給A :: Initialize()與傳遞指向B的指針沒有區別,在這方面,如果B是強制的,Initialize()dos的聲明不會聲明不。在我的情況下,我想通過參考B來表達它。
我們的代碼目前並未使用boost。所以,雖然shared_ptr比只傳遞原始指針更好的解決方案,但我提出的解決方案可能被認爲是不好的,但仍然是解決方案。
你不應該有一個名爲Initialize()的函數 - 你應該有一個構造函數。 – 2009-12-06 17:38:58
您可以使用bcp將單個組件從boost中提取出來:http://www.boost.org/doc/libs/1_41_0/tools/bcp/bcp.html – 2009-12-06 18:58:35