例如下面是我的代码
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( ... );
...
}