gpt4 book ai didi

c++ - C++ 中的静态成员 Qt 对象

转载 作者:行者123 更新时间:2023-11-28 03:11:11 25 4
gpt4 key购买 nike

我有以下类(class)

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

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

谢谢大家

最佳答案

最干净的方法是:

  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

关于c++ - C++ 中的静态成员 Qt 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18433422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com