2012-03-15 4 views
0

私はDeviceクラスを持っているとします。プログラマが自分のDeviceオブジェクトをインスタンス化できるようにしたいので、DeviceManagerクラスを作成します。 DeviceManagerは、インスタンス化される唯一のエンティティであり、プログラマが何らかのIDを指定することによって、プログラマがDeviceオブジェクトにアクセスできるようにします。このようにして、DeviceManagerクラスのみがプログラマによってクリーンアップされ、漂遊Deviceオブジェクトは残されません。私の主な関心事は、面倒なガベージコレクションのためにオブジェクトへのアクセスを制御する方法です。私はC++で良いアイデアを記述したような "マネージャ"パターンですか?ありがとう!どのようにしてC++でオブジェクトへのアクセスを制御できますか?

答えて

2

本当に必要な場合は、はい。この制御を達成するために

、あなたはDeviceprivateのコンストラクタを作成し、Deviceクラスで保護されたようDeviceManagerを宣言することができます。

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

friend class DeviceManager; 
}; 

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

また、(推奨)Deviceへのスマートポインタを返すことができますし、何が必要に応じて、DeviceManagerの内側に作成されたデバイスを保ちます。

インスタンスマネージャパターンと呼ばれます。 DeviceManagerもデバイスの工場です。

また、C++にはガベージコレクションはありませんが、スマートポインタを使用する場合はメモリ管理について心配する必要はありません。

+0

私は**デバイスのポインタを返さない**を除きます。 DeviceManagerがライフスパンを管理している場合、またはスマートポインタを返して所有者の共有セマンティクスを呼び出し元に示す場合、呼び出し元が返されたデバイスの所有権を取得/共有するかどうかを示す場合に参照を返します。 –

0

私たちはPrivate Constructorを使ってこれを達成できます。 プライベートコンストラクタは特別な種類のコンストラクタです。静的メンバのみを含むクラスでよく使用されます。クラスにプライベートコンストラクタが1つ以上あり、パブリックコンストラクタがない場合、他のクラスはこのクラスのインスタンスを作成できません。 例えば

class abc 
{ 
private abc() 
{} 

} 

空のコンストラクタの宣言は、デフォルトコンストラクタの自動生成を防止します。コンストラクタでアクセス修飾子を使用しない場合でも、デフォルトではprivateであることに注意してください。ただし、private修飾子は、通常、クラスをインスタンス化できないことを明示するために明示的に使用されます。

プライベートコンストラクタは、Mathクラスなどのインスタンスフィールドやメソッドがない場合、またはクラスのインスタンスを取得するためにメソッドが呼び出されたときに、クラスのインスタンスの作成を防止するために使用されます。クラス内のすべてのメソッドが静的である場合は、クラス全体を静的にすることを検討してください。

関連する問題