Проблема класса Singleton в Qt - PullRequest
0 голосов
/ 25 мая 2010

я создал одноэлементный класс и пытался получить доступ к этому классу в другом классе, но получил ошибку "не может получить доступ к приватному члену"

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 ]

2 голосов
/ 25 мая 2010

Вы должны объявить статический член в исходном файле, а не в заголовочном файле, независимо от того, используете ли вы член статического класса или подход статического члена функции. Ваш основной подход должен работать, если функция 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()
{
    //....
}
0 голосов
/ 01 июля 2010

У этого подхода есть недостатки: и конструктор копирования, и конструкторы присваивания (которые создаются компилятором C ++ по умолчанию) создадут копию так называемого синглтон-класса (здесь имена: SetupConfig). Вы также должны объявить эти буксирные конструкторы как частные.

0 голосов
/ 25 мая 2010

Почему вы извлекаете "EasyBudget" из одноэлементного класса "SetupConfig"?

Удалите эту часть, чтобы решить вашу проблему.

EasyBudget.h
class EasyBudget : public QMainWindow, public Ui::EasyBudgetClass
{......
0 голосов
/ 25 мая 2010

Попробуйте

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

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