Qt中的Singleton类问题

时间:2010-05-25 07:26:34

标签: c++ qt qt4 qt-creator

我创建了一个单例类,并试图在其他类中访问该类但却出错 “无法访问私人会员”

Setupconfig是我的单例类,我试图在其他具有QMainWindow

的类中访问此类

以下是错误消息:

  

错误'Setupconfig :: Setupconfig':无法访问私有成员   在“Setupconfig”类中声明

Setupconfig.h
static Setupconfig *buiderObj()
{
    static Setupconfig *_setupObj= new Setupconfig();
    return _setupObj;
}

private:
Setupconfig();

//////////////////////////////////////
EasyBudget.h
class EasyBudget : public QMainWindow, public Ui::EasyBudgetClass, public Setupconfig
{
Q_OBJECT
public:
Setupconfig *setupObj;
}

//////////////////////////////////////
EasyBudget.cpp
EasyBudget::EasyBudget(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent,Qt::FramelessWindowHint)
 {
 setupObj=Setupconfig::buiderObj();
 }

4 个答案:

答案 0 :(得分:2)

您应该在源文件中声明静态成员,而不是在头文件中,无论您是否使用静态类成员或静态函数成员方法。如果instance()函数是公共成员,那么您的基本appoach应该有效:

//setupconfig.h
class Setupconfig 
{
 public:  

static Setupconfig* instance();


private:
        SetupConfig();
};

//setupconfig.cpp
static Setupconfig* SetupConfig::instance()
{
   static Setupconfig* _setupObj= new Setupconfig();
   return _setupObj;
}

SetupConfig::SetupConfig()
{
    //....
}

也可以使用类成员方法

//setupconfig.h
class Setupconfig 
{
 public:  

static Setupconfig* instance();


private:
        SetupConfig();

        static Setupconfig*  _setupObj;
};

//setupconfig.cpp
Setupconfig*  Setupconfig::_setupObj = 0;

static Setupconfig* SetupConfig::instance()
{
   if (_setupObj == 0) {
        _setupObj = new Setupconfig;
   }
   return _setupObj;
}

SetupConfig::SetupConfig()
{
    //....
}

答案 1 :(得分:0)

试试这个

 public:
    static Setupconfig *buiderObj() 
    { 
        if(*_setupObj; != null)
        {
           _setupObj= new Setupconfig(); 
        }
    return _setupObj; 

    } 
    public:
    Setupconfig(){}
    private:
    Setupconfig *_setupObj;

答案 2 :(得分:0)

为什么要从单例类“SetupConfig”中派生出“EasyBudget”?

删除该部分以解决您的问题。

EasyBudget.h
class EasyBudget : public QMainWindow, public Ui::EasyBudgetClass
{......

答案 3 :(得分:0)

这种方法存在一些缺点,复制构造函数和赋值构造函数(默认情况下由C ++编译器生成)将复制所谓的单例类(此处名称:SetupConfig)。您还应该将这些拖曳构造函数声明为私有。