【问题标题】:Singleton class issue in QtQt中的单例类问题
【发布时间】:2010-05-25 07:26:33
【问题描述】:

我创建了一个单例类并尝试在其他类中访问该类但出现错误 “无法访问私有成员”

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();
 }

【问题讨论】:

  • 我想这需要标记为“C++”

标签: c++ qt qt4 qt-creator


【解决方案1】:

您应该在源文件中而不是在头文件中声明静态成员,无论您使用静态类成员还是静态函数成员方法。如果 instance() 函数是公共成员,您的基本方法应该可以工作:

//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()
{
    //....
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • Thnaks... 我编译没有任何错误,但在运行时出现中断
    • 您能否在运行时发布有关该问题的更多详细信息?
    • 我做了同样的你说并得到运行时错误.....错误是访问冲突读取内存
    【解决方案3】:

    试试这个

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

    【讨论】:

    • 错误 4 错误 C2597: 非法引用非静态成员 'Setupconfig::_setupObj' d:\test\easybudget\easybudget\setupconfig.h 64 EasyBudget
    • 还需要将 _setupObj 成员声明为静态才能进行这项拖曳工作。
    【解决方案4】:

    这种方法有一些缺点,复制构造函数和赋值构造函数(由 C++ 编译器默认生成)都会复制所谓的单例类(这里名称:SetupConfig)。您还应该将这些两个构造函数声明为私有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多