2016-09-16 4 views
0

私には奇妙な質問があります。とても奇妙なので、おそらく簡単に解決することができます。シングルトンクラスを使用してすべてのクラスから到達する

私はソフトウェアを作成しました。ソフトウェアからすべてのクラスから到達する必要がある歌のオブジェクトでクラスを実装する必要があります。したがって、私はmain関数でシングルトンオブジェクトとして作成しました。

私の問題は、コード内のすべての単一クラスへのポインタによってハンドラされるポインタを作成せずに、オブジェクトがClassAのような他のクラスからどのように到達できるかです。

すべてのクラス定義はsing.hファイルにあります。私がsing.cppファイルに定義を入れると、コンパイラは失敗します。

私はこの歌のオブジェクトを作成することができましたが、ClassAからは見えません。各クラスのコンストラクタへのポインタを渡すことなく、オブジェクトをどのように見せることができますか?

sing.hファイル:

#ifndef _SING_H_ 
#define _SING_H_ 

//declaration 
class Singleton 
{ 
public: 
    static Singleton* Instance(); 
    static Singleton* InstanceSlave(); 
    int a; 
    int setTest(int); 

protected: 
    Singleton(){} 

private: 
    static Singleton* _instance;  
    static Singleton* _instanceSlave; 

}; 

//definitions (only work in header file, not in .cpp file 

Singleton* Singleton::_instance =0; 

Singleton* Singleton::Instance() 
{ 

    if (_instance == 0) 
    { 
     _instance = new Singleton; 
    } 
    return _instance; 

} 

int Singleton::setTest(int b) 
{ 
return 1; 
} 

#endif _CONF_H_ 

main.cppにファイル:

int main() 
{ 
Singleton* sing = sing->Instance(); 
sing->setTest(2); 

ClassA* classa = new ClassA(); 
} 

main.hファイル:

#inlucde <iostream> 
#include "sing.h" 
#include "classA.h" 

にClassA内部の私のような何かを持っていると思いますこれは:

classA.h

#inlude sing.h 
class classA 
{ 
public: 
    void doSomeThing(int); 
} 

classA.cpp:

#include ClassA.h 
{ 
void ClassA::doSomeThing(int a) 
{ 
    sing.setTest(a); 
} 
} 
+0

アンダースコアで始まり大文字で始まる各名前は実装に予約されています。 '_SING_H_'を定義するべきではありません。例えば、 'SING_H_'はOKです。 – user2079303

答えて

-1

ただ、私の問題は、オブジェクトが歌うことができるのポインタを作成せずに(にClassAのような)他のクラスから到達するか、である

Singleton::Instance()->setTest(a); 
3

を使用コード内のすべての単一クラスへのポインタによってハンドリングされます。

標準的な方法は、Scott Meyer's Singletonを使用して

static Singleton& Instance() { 
     static Singleton theInstance; 
     return theInstance; 
    } 

使用法のような静的な機能を提供することであるシングルトンパターンが本当に考慮されていない一般的に

Singleton::Instance().setTest(2); 

コードの残りの部分との結合あまりにもタイトです。インタフェース(抽象クラ​​ス)を使用し、必要に応じてこれらを渡す方がよいでしょう。

関連する問題