我有以下类
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