статический член не обновляется - PullRequest
0 голосов
/ 24 декабря 2011

Я столкнулся с очень странным поведением.В моем классе QFileSystemModel объявлен как статическая переменная, и эта переменная инициализируется в ctor, и это работает, но как только я пытаюсь обновить его состояние (с помощью некоторого метода из этого класса), это, похоже, не имеет никакого эффекта,Но как только я изменяю эту переменную на нестатическую, все работает как надо.Что в статических переменных мне не хватает?

class X:public QDialog
{
Q_OBJECT
static QFileSystemModel* model_;
public:
void update();
};

//cpp file
X::QFileSystemModel* model_  
X::X()
{
model_ = new QFileSystemModel(this);
}

void X::update()
{
model_->setNameFilters("*.h");//this will have absolutely no effect unless I make  
//model_ non static
}

Ответы [ 2 ]

2 голосов
/ 24 декабря 2011

Вам нужно сделать это так, чтобы предотвратить множественные инициализации model_:

//cpp file
X::QFileSystemModel* model_ = 0; // Not strictly necessary, but good for clarity
X::X()
{
if (model_ == 0) model_ = new QFileSystemModel(this);
}
1 голос
/ 24 декабря 2011

Поскольку вы создаете новый model_ для каждого нового экземпляра вашего класса X (каждый раз, когда запускается конструктор), описываемая вами проблема, кажется, сводится к чему-то длинному; перезапись.

Вероятно, он перезаписывается другим вновь созданным экземпляром после установки какого-либо состояния в X::update.

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

Простой пример решения

struct Obj {
  Obj () {
    std::cerr << "model_: " << *model_ << std::endl;

    ++(*model_);
  }

  static int * model_;
};

int * Obj::model_ = new int (); // initialize the static member

int
main (int argc, char *argv[])
{
  Obj a, b, c;
}

Опечатка?

Я предполагаю, что эта часть вашего фрагмента содержит опечатку, поскольку конструктор не может иметь тип возвращаемого значения.

X::QFileSystemModel* model_  
X::X()
{
model_ = new QFileSystemModel(this);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...