稍后创建QScopedPointer的实例



例如下面是我的代码

QScopedPointer<QTimer> timer2(new QTimer);
但是我想定义
QScopedPointer<QTimer> timer2; 
在mainwindow.h中创建实例
timer2(new QTimer);

如何?

尝试如下:

// mainwindow.h
class MainWindow : public QMainWindow
{
private:
    QScopedPointer<QTimer> timer2;
};

如果您想在构造函数中创建实例,请使用以下命令:

// mainwindow.cpp
MainWindow::MainWindow()
    :timer2(new QTimer)
{
}

或者,如果您想在MainWindow的任意成员函数中创建实例,请使用:

// mainwindow.cpp
void MainWindow::someFunction()
{
    timer2.reset(new QTimer);
}

同样值得回顾c++中的初始化列表和QScopedPointer的文档。

使用QScopedPointer的reset方法

timer2.reset(new QTimer());

你所做的相当于过早悲观。当您应该简单地将它们作为成员放入类中时,您正在单独地和单独地在堆上创建MainWindow的成员:

// interface
#include <QMainWindow>
#include <QTimer>
class MainWindow : public QMainWindow {
  Q_OBJECT
  QTimer m_timer;
public:
  MainWindow(QWidget * parent = 0, Qt::WindowFlags flags = 0);
};
// implementation
MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags flags) :
  QMainWindow(parent, flags),
  m_timer()
{
  ...
}

当然,您通常不希望在接口(头)文件中公开MainWindow实现的所有细节。因此,您可以利用PIMPL习语:

// interface
#include <QMainWindow>
class MainWindowPrivate;
class MainWindow : public QMainWindow {
  Q_OBJECT
  Q_DECLARE_PRIVATE(MainWindow)
  QScopedPointer<MainWindowPrivate> const d_ptr;
public:
  MainWindow(QWidget * parent = 0, Qt::WindowFlags flags = 0);
}
// implementation
#include "MainWindow.h"
#include <QTimer>
class MainWindowPrivate {
public:
  QTimer timer;
}
MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags flags) :
  QMainWindow(parent, flags),
  d_ptr(new(MainWindowPrivate())
{
  Q_D(MainWindow);
  d->timer.start( ... );
  ...
}

相关内容

  • 没有找到相关文章

最新更新