2012-03-15 68 views
0

想象一下,我有一個設備類。我不希望程序員能夠實例化他自己的Device對象,所以現在我創建一個DeviceManager類。 DeviceManager是唯一實例化的實體,通過讓程序員指定某種類型的ID,程序員可以訪問Device對象。這樣,只有DeviceManager類需要由程序員清理,並且不會留下任何流浪的Device對象。我主要關心的是如何控制訪問對象的好處垃圾收集的利益。像我在C++中描述的一個好主意一樣,是一個「管理者」模式嗎?謝謝!如何控制對C++中對象的訪問?

回答

2

如果你真的需要它,是的。

爲了實現這種控制,可以使Deviceprivate的構造,並宣佈DeviceManager作爲Device類保護。

class Device 
{ 
private: //not necessary, private by default 
    Device(); 

friend class DeviceManager; 
}; 

class DeviceManager 
{ 
public: 
    Device* getDevice(); 
}; 

你也可以返回一個智能指針到Device(推薦),並保持創建的設備的DeviceManager內,這取決於你所需要的。

這被稱爲實例管理器模式。 DeviceManager也是設備的工廠。另外,C++沒有垃圾回收功能,但是如果你使用智能指針,你不需要擔心內存管理。

+0

除了我會**不**返回指向設備的指針。如果DeviceManager管理壽命或返回一個智能指針以向呼叫者指示所有權共享語義,則返回引用,從而指示呼叫者是否獲取/共享返回設備的所有權。 – 2012-03-15 21:08:49

0

我們可以通過使用Private構造函數來實現這一點。 私有構造函數是一種特殊的構造函數。它常用於只包含靜態成員的類。如果一個類有一個或多個私有構造函數並且沒有公共構造函數,則其他類不允許創建此類的實例。 對於e.g

class abc 
{ 
private abc() 
{} 

} 

空構造的聲明防止自動生成一個缺省的構造的。請注意,如果您在構造函數中不使用訪問修飾符,則默認情況下它仍然是私有的。但是,私有修飾符通常用於明確說明該類不能被實例化。

當沒有實例字段或方法(如Math類)或調用方法以獲取類的實例時,私有構造函數用於防止創建類的實例。如果類中的所有方法都是靜態的,則考慮將整個類設爲靜態。