C++中的静态成员Qt对象
Static member Qt objects in C++
我有以下类
class QBoardImages
{
public:
QImage empty_white;
QImage empty_black;
QImage possible_move;
QImage lighter;
QImage choosed;
QImage multiple_move;
QImage blue_pawn;
QImage blue_queen;
QImage blue_skydiver;
QImage red_pawn;
QImage red_queen;
QImage red_skydiver;
QBoardImages();
};
与构造函数,我有:
QBoardImages::QBoardImages()
{
QDir::setCurrent(QApplication::applicationDirPath());
empty_white.load("images/board/white.png");
empty_black.load("images/board/black.png");
lighter.load("images/board/lighter.png");
choosed.load("images/board/choosed.png");
blue_pawn.load("images/board/blue_pawn.png");
blue_skydiver.load("images/board/blue_skydiver.png");
blue_queen.load("images/board/blue_queen");
red_pawn.load("images/board/red_pawn.png");
red_skydiver.load("images/board/red_skydiver.png");
red_queen.load("images/board/red_queen.png");
possible_move.load("images/board/possible_move.png");
}
当然,我只想加载这些图像一次,但我无法做到这一点。。只加载一次这些图像的最佳方式是什么?
感谢所有
最干净的方法是:
- 保持课堂现状
- 在应用程序开始时实例化此类的一个对象
- 为需要这些图像的其他类的任何构造函数提供指向该对象的指针或引用
使用引用(如果你喜欢的话,可以使用指针):
class MyOtherClass1 : // ...
{
public:
MyOtherClass1(QBoardImages & boardImages) :
boardImages_(boardImages)
{
// ...
}
private:
QBoardImages & boardImages_;
};
class MyOtherClass2 : // ...
{
// same pattern
}
int main(/* ... */)
{
// ...
QBoardImages boardImages;
MyOtherClass1 object1(boardImages);
MyOtherClass1 object2(boardImages);
// ...
}
另一种方法是使用静态方法/对象,虽然不太干净,但可能最容易实现,因为您不必将boardImages
对象传递给每个构造函数。Singleton模式是实现这一点的典型方法,但在您的案例中,问题是您调用了QApplication::applicationDirPath()
,根据您在哪里使用此类,它可能还无法访问。
处理这个问题的方法是自己实例化和删除内存,并确保在这些调用之间只使用这个类。例如:
// QBoardImages.h
class QBoardImages
{
public:
static QBoardImages * instance();
static void makeInstance();
static void deleteInstance();
QImage empty_white;
// ...
private:
QBoardImages();
static QBoardImages * instance_;
};
// QBoardImages.cpp
QBoardImages * QBoardImages::instance_ = 0;
void QBoardImages::makeInstance(){ instance_ = new QBoardImages; }
void QBoardImages::deleteInstance(){ delete instance_; }
QBoardImages * QBoardImages::instance()
{
if(!instance_)
makeInstance();
return instance_;
}
QBoardImages::QBoardImages()
{
QDir::setCurrent(QApplication::applicationDirPath());
empty_white.load("images/board/white.png");
// ...
}
// main.cpp
int main(int argc, char ** argv)
{
QApplication app(argc, argv);
QBoardImages::makeInstance(); // make sure to call this
// after instantiation of app
// ...
int retValue = app.exec();
QBoardImages::deleteInstance();
return retValue;
}
现在,您可以使用在调用makeInstance
和deleteInstance
之间的任何位置使用图像
QBoardImages::instance()->empty_white
相关文章:
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 如何注册Qt C++对象以在QML中使用它
- Qt对象所有权内存泄漏
- 以延长构造函数外部 QT 对象的生存期
- 我有一个 Qt 对象的 2d 数组,我已经用值播种了这些对象。如何访问数组中特定对象的值并更改它们?
- Qt对象如果使用'this'创建(更新)需要删除或自动删除?
- 在 cmake 中链接 Qt 对象
- 将流运算符添加到 Qt 对象
- 在 QT 对象类中声明 PCL 点云
- QT对象::连接:没有此类插槽信号到线程插槽
- 如何在调试期间查看Qt对象QByteArray的内容
- Qt对象删除导致崩溃
- 如何从线程的结果返回Qt对象(Qtfutur)
- QtWebkit javascript bridge,无法访问 Qt 对象方法
- 将 Qt 对象与 std::shared_ptr 一起使用
- 带有 Qt 对象的 Cmake 库
- 向QML公开复杂的Qt对象C++
- 从另一个 std::thread 调用 Qt 对象方法
- Qt 对象实例化查询
- C++中的静态成员Qt对象