(この質問はグローバル+ユニークなオブジェクトが目標であることを前提としていますが、これは、シングルトンやグローバルを使用する/使用しないことを尋ねているわけではありません)。シングルトンの実装:シングルトンクラスよりもネームスペースのアプローチが望ましいことはよくありますか?
は、C++有効でシングルトンパターンの名前空間の実装です:私の質問があるので、私は欠けているCについての専門的++があるかどう
私は疑問に思って?もしそうなら、それがしばしばより良いアプローチとして提案されていない理由はありますか? Googleのスタイルガイドラインから
、我々は静的メンバ関数上で推奨される非メンバ関数を名前空間参照が、静的データを共有していないときにのみ:
「だけではなくグループの静的メンバ関数にクラスを作成 ました静的なデータを共有しないでください。代わりに名前空間を使用してください。 "
メンバー以外の関数に名前のない名前空間で宣言された静的なデータを共有させないようにするのはなぜですか?名前空間がC++でシングルトンクラスを書くより良い代替手段として一般に提案されていない理由を説明する、これについて何か間違っていますか?
私は名前空間のアプローチの勧告を見つけることができませんので、Cにもかかわらず、クラスのアプローチを見つけることは非常に容易である++クラスの使用を強制しませ:
Can any one provide me a sample of Singleton in c++?
Singleton instance declared as static variable of GetInstance method
http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
Singleton: How should it be used
そのソース・ファイル内の無名の名前空間を持つという名前の名前空間を使用して:あなたは、静的なデータ
- あなたは無名の名前空間で物事を入れて、余分なプライバシーを得ることができます
- 静的ポインタを使用し、関数呼び出しから構築することによって、静的オブジェクトの作成順序を制御することはできます。
SingleThing.h:
namespace single_thing // The singleton (if this is actually valid) { void GrowSomeCats(int amount); // Typical setter int GetNumCats(); // Typical getter }
SingleThing私が考えていた名前空間のアプローチの例 - あなたはシングルトンクラス
編集を実装する必要はありません
#include "Balloon.h"
namespace // Acting like private members and functions
{
int numCats = 4; // POD
Balloon* wilson = NULL; // Not POD (and not a singleton)
// Contrived 'private' function
bool CanGrowCats()
{ return wilson && wilson->LikesCats(); }
// Contrived excuse to instantiate non-POD 'members'
void RandomlyCreateOtherObjects()
{
if (!wilson /* && someRandomiserImTooLazyToType()*/)
wilson = new Balloon();
}
}
namespace single_thing // 'Public' functions
{
void GrowSomeCats(int amount)
{
RandomlyCreateOtherObjects();
if (CanGrowCats())
numCats += amount;
}
GetNumCats()
{ return numCats; }
}
これは、オブジェクト指向プログラミングのメリットについての質問です。関連する状態と関数を「クラス」にまとめる価値がありますか?私が思うシングルトンであるという事実も、ほとんど無関係です。 –
これはスレッドセーフではありません。マイヤーのシングルトンを探してみることをお勧めします。 –
多くのおかげです。 – Xenial