静态成员未更新

时间:2011-12-24 08:04:12

标签: c++ qt

我遇到了非常奇怪的行为。在我的类中,我将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 个答案:

答案 0 :(得分:2)

您需要这样做,以防止多次初始化model_

//cpp file
X::QFileSystemModel* model_ = 0; // Not strictly necessary, but good for clarity
X::X()
{
if (model_ == 0) model_ = new QFileSystemModel(this);
}

答案 1 :(得分:1)

由于您为类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);
}