2013-10-10 2 views
-1

싱글 톤없이이 클래스의 단일 인스턴스를 만들려면 어떻게해야하며 다른 클래스가 전역 적으로 선언하지 않고도 액세스 할 수 있도록 어떻게 선언 할 수 있습니까?C++이 클래스와 싱글 톤에 대한 전역 선언에 대한 좋은 대안이 있습니까?

더 나은 이해를위한 코드 (특히 코멘트)을 읽어 보시기 바랍니다 :

#include <iostream> 
#include <vector> 

// The only class that will be using this class is Obj... 
// There can only be a single instance of ObjManager but how can I do that 
// without singleton??? 
class ObjManager 
{ 
    friend class Obj; 
    int i; 
}; 

// Since I cannot think of a better way of accessing the SAME and ONLY ObjManager, I 
// have decided to declare a global instance of ObjManager so every instance of 
// Obj can access it. 
ObjManager g_ObjManager; 

class Obj 
{ 
    friend class ObjManager; 
public: 
    void Set(int i); 
    int Get(); 
}; 

void Obj::Set(int i) { 
    g_ObjManager.i += i; 
}; 

int Obj::Get() { 
    return g_ObjManager.i; 
}; 

int main() { 
    Obj first_obj, second_obj; 

    first_obj.Set(5); 
    std::cout << second_obj.Get() << std::endl; // Should be 5. 
    second_obj.Set(10); 
    std::cout << first_obj.Get() << std::endl; // Should be 15. 

    std::cin.get(); 
    return 0; 
}; 
+2

God 객체가 필요하지 않은 분명한 이유가 없습니다. 당신이 프로그래머 일 때 하나님은 의자와 모니터 사이에 있고, 다른 사람에게 그 일을 넘겨 줄 수는 없습니다. –

+0

이것이 싱글 톤 패턴의 핵심은 아닌가? 왜 그걸하지 않고 왜 그렇게하고 싶습니까? – Barmar

+0

당신이하고있는 일과 함께, 정적 멤버로 똑같은 것을 성취 할 수 있습니다. –

답변

0

모든 Obj 인스턴스가 동일한 ObjManager 인스턴스를 공유하는 (그리고 당신이 Obj 's를 ObjManager를 사용하여 작성 싱글 톤 패턴을 사용하지 않음), 당신이 ObjObjManager의 정적 멤버를 만들 수 있습니다 원하는 경우 : 당신이 Obj의 인스턴스를 만들 때

class ObjManager { ... }; 

class Obj 
{ 
private: 
    static ObjManager manager; 
}; 

그런 다음 다른 모든 인스턴스와 같은 ObjManager을 공유합니다.

1

은 왜 무엇인가 :

class ObjManager 
{ 
private: 
    ObjManager() {} 

public: 
    static ObjManager& get() { 
     static ObjectManager m; 
     return m; 
    } 
    friend class Obj; 
    int i; 
}; 

은 그럼 그냥 참조를 얻을 수 ObjManager::get를 호출합니다. 보너스로, 실제로 사용하는 경우에만 건설됩니다. 그것은 여전히 ​​싱글 톤이지만 글로벌 (내 의견으로는)보다 조금 낫습니다.

관련 문제