2011-11-19 44 views
0

我试图做一个单身用gccC++单,stackoverflows例如不工作

我发现计算器几个例子,遗憾的是他们没有为我工作。

这里是我的.h文件:

#ifndef GLOBALINFO_H 
#define GLOBALINFO_H 

#include <string> 
#include <iostream> 

using namespace std; 
class GlobalInfo 
{ 
    private: 
     GlobalInfo(); 
     GlobalInfo(GlobalInfo const&); 
      GlobalInfo& operator=(GlobalInfo const&); 


    public: 
     static GlobalInfo& GetInstance(); 
     virtual ~GlobalInfo(); 

     bool isFullScreen; 
     int screenWidth; 
     int screenHeight; 
     string title; 

    protected: 
}; 

#endif // GLOBALINFO_H 

这里是我的.cpp:

#include "GlobalInfo.h" 

GlobalInfo::GlobalInfo() 
{ 
    isFullScreen = false; 
    screenWidth = 800; 
    screenHeight = 600; 
    cout << "creating GlobalInfo" << endl; 
} 

GlobalInfo::~GlobalInfo() 
{ 
} 

GlobalInfo &GlobalInfo::GetInstance() { 
    static GlobalInfo instance; 
    return instance; 
} 

GNU C说:

include\GlobalInfo.h|12|error: 'GlobalInfo::GlobalInfo(const GlobalInfo&)' is private| 

如果我删除

GlobalInfo(GlobalInfo const&); 
GlobalInfo& operator=(GlobalInfo const&); 

从头,我得到的单身人士,这是不好的在这种情况下的实际副本,因为我使用isFullScreen根据用户输入信息。

+1

[我确定你知道你在做什么,我只是觉得我会指出单身人士是一个非常有争议的设计模式。如果你在SO或互联网上搜索,你会发现很多讨论。] –

+0

是的,我知道,但我读了不少聪明人使用单身人士的书。我不确定为什么争议设计应该意味着“不要使用它”,所有事情都在互联网上引起争议。我需要一个全局范围来访问我游戏中任何地方的一些东西(因此名为GlobalInfo)。作为一个长期的C程序员(> 20年),但相对较新的C + +我不知道什么更好的方式来实现这一点,然后通过单身。使用'extern bool isFullScreen'的C方式肯定更糟糕。 – Hellagot

回答

6

你怎么实际使用单例类?在尝试调用复制构造函数时,您应该会收到编译错误,因为获取单例实例的唯一方法应该是通过GetInstance。也许你忘了调用代码使用参考:

GlobalInfo& gi = GlobalInfo::GetInstance(); 

如果您忘记了&运营商,你会有效地试图复制单身,这正确导致编译错误。

+0

非常感谢你,那就是问题所在 – Hellagot