2012-05-01 10 views
2

私は、これらの関数によって後で処理されるかもしれないデータを生成するいくつかのC++関数を書いていますが、他の場所では処理されません。これらの機能は、いくつかのより高いレベルのGUI変更のための「低レベル」です。クラス外のデータをカプセル化する

私は現在、別々の名前空間にこれらの関数をラップしており、静的な(内部的にリンクされた)ベクトルを宣言しています(オブジェクトは構造体として定義され、名前空間にも含まれています)。このように、一般的な構造:

namespace Foo 
{ 
    struct Bar 
    { 
     string data; 
    }; 

    void func1(); 
    void func2(); 
    static std::vector<Bar> cachedBars; 
} 

私は本当にこのためのクラスを必要としない、とシングルトンに頼ることに興味はないですか。この解決策は十分ですか?具体的には、ネームスペーススコープコレクションを内部的にリンクして、そのコレクションへのアクセスを制限する最良の方法と、グローバル変数の落とし穴をすべて回避するか、より良い方法がありますか?

+3

グローバルな落とし穴を避けているわけではありません。 –

+1

これはヘッダファイルですか?その場合は、ファイルをインクルードするすべての場所にcachedBarsのコピーが作成されます。 –

+0

@Cat:私はそれが少なくとも世界的であることを望んでいました。 –

答えて

3

、私は.hの中の関数のことだけ宣言を置く

void func1(); 
void func2(); 

そして匿名の名前空間の下の.cppの隠されたもの。それと

namespace 
{ 
    struct Bar 
    { 
     string data; 
    }; 

    static std::vector<Bar> cachedBars; 
} 

void func1() { /* do something */ } 
void func2() { /* do something else */ } 

、関数func1とfunc2のは、どこからでもアクセスすることができますが、バーとcachedBarsだけ.cppファイルで定義された関数でアクセスできるので、関数func1とfunc2のだろう。 .cppに何もない限り、func1とfunc2だけがcachedBarsを変更できます。

匿名の名前空間は、可視性を変更する際にstaticキーワードと同じ効果があります。しかし、あなたはそれでほとんど何も隠すことができるので、より強力です。

+0

これはグローバルネームスペースを狂わせるでしょうか? –

+0

本当にありません。匿名の名前空間はグローバルな名前空間ではなく、ファイルのローカルな新しい名前空間です。したがって、グローバル名前空間には何の影響もありません。私が言ったように、それはちょうど静的なキーワードを使用するのと同じです。 – Morwenn

+0

素晴らしい。担当者とチェックマークを付けてください。どうもありがとう! –

1

私が通常この場合に行うことはfunc1()func2()の機能を.hファイルに入れています。静的ベクトルは、関数本体とともに.cppの内部に入ります。

struct Bar.hファイルに表示する必要があると思われるのは、通常、関数がその構造体をパラメータとして返すか取得するためです。しかし、構造体について誰も知る必要がない場合は、.cppにも非表示にしてください。 (それだけでポインタや参照が渡されること/返された。そして、あなたはそれを転送し、宣言することができることも可能です。)実際に

+0

これはインターフェイスの問題に役立ちますが、ベクター自体はどうですか?名前空間スコープの内部リンケージは、クラス外のコレクションへのアクセスを管理する効果的な方法ですか、それとも良い方法ですか? –

+2

匿名の名前空間で.cppを隠す方が簡単です。それでは、で定義されている関数のみ。cppはそのすべてにアクセスできます。 – Morwenn

+0

答えに多くの感謝! –

関連する問題