2012-01-26 1 views
3

私はいくつかの静的オブジェクトを保持するクラス(AbcdBase)を作成しました。これらはマップとヘルパー関数のプロットなどの "ヘルパーツール" 、テーブルを作成するための定数を格納するオブジェクトなどがあります。静的データメンバーを互いに異なるクラス間で共有することで、互いにインスタンスを作成することができます

私はこれらの静的メンバーにアクセスする必要のある他のクラス(DataSampleとDoABCD)を持っていますが、DoABCDはDataSampleのインスタンスをいくつか作成します。これをコーディングする正しい方法は何でしょうか? DataSampleとDoABCDの両方をAbcdBaseの派生クラスにすることは、正しい方法のようには見えません(私はそれを行うとSeg違反をします)。

class AbcdBase { 

private: 
    int init(); 
    int status; 

public: 

    static SampleAggregator* SampleAggregatorInst; 
    static PlotHelper* PlotHelperInst; 
    static DataSampleConst* DataSetMap; 
    static DataSampleConst::SampleDict* ListOfSamples; 
    static std::vector<std::string> ListOfPlots; 
    static std::vector<std::string> ListOfRegions; 
    static Logger* LoggerInst; 

    AbcdBase(); 
    virtual ~AbcdBase(); 

    typedef enum { 
     A = 1, B = 2, C = 3, D = 4 
    } RegionEnum; 
    typedef enum { 
     MET = 1, ETCONE20 = 2 
    } DimensionEnum; 

ClassDef(AbcdBase, 1) 
}; 

シングルトンはこの問題を解決する正しい方法ですか? DataSampleまたはDoABCDがAbcdBaseのメンバーにアクセスする必要があるときはいつでも、instance()関数が呼び出され、AbcdBaseのプライベートインスタンスへのポインタを返します。私はこれがコードをたくさん混乱させるように感じる。

おかげ

+0

'ClassDef(AbcdBase、1)とは何ですか? –

+0

シングルトンは決して適切なソリューションではありません。 – spraff

+0

これは、ROOT(科学的データ分析フレームワーク、そのクラス定義が本質的にROOTによって必要とされている....)内で使用される一連のクラスです。私がまだ理解していない理由からです。 –

答えて

1

は別に私はそれらの静的メンバ

へのアクセスを必要とする他のクラス(DataSampleとDoABCD)が単にあなたが行ったように、これらの静的メンバを公開を宣言した後、それらを参照します(DataSampleまたはDoABCD内のコードを含む、他のコードで:。

class DataSample { 
    ... 
    int GetFragle(void) { 
    return AbcdBase::PlotHelperInst->m_fragle; 
    } 
    ... 
}; 
0

何かをする必要はありません

既に公開されているので、AbcdBase :: PlotHelperInstをどこからでも使用できます。

ところで、これをグローバルとして使用しています。それを認めてくれる勇気があるかもしれません。それらをクラス外に移動します。

関連する問題