0

我有以下课程

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");
}

当然我只想加载这些图像一次,但我无法做到这一点.. 只加载这些图像一次的最佳方法是什么?

谢谢你们

4

1 回答 1

2

最干净的方法是:

  1. 保持你的班级现在这样
  2. 在应用程序开始时实例化该类的一个对象
  3. 向需要这些图像的其他类的任何构造函数提供对该对象的指针或引用。

使用引用看起来像这样(如果您愿意,可以使用指针):

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对象传递给每个构造函数,确实是使用静态方法/对象。单例模式是实现这一点的典型方法,但在您的情况下,问题是您调用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;
}

现在,您可以在通话之间的任何地方使用您的图像,makeInstancedeleteInstance使用:

QBoardImages::instance()->empty_white
于 2013-08-26T03:55:13.907 回答