我的一个程序类是在窗口的不同位置绘制图像序列。该类有多个实例,但它是在窗口内的所有位置绘制的相同图像序列。我想防止多个类初始化多个图像序列的实例以避免吃掉内存,为此我将图像序列变量作为静态变量
class Drawer{
private:
static ImageSequence imgSequence;
};
在.cpp文件中,我正在执行以下操作来初始化静态var。
#include "Drawer.h"
ImageSequence Drawer::imgSequence = ImageSequence();
但是,我有两种方法来指定图像序列的路径和预加载帧 - 并且混淆了放置这些方法的位置,以便每个Drawer类实例化不会一次又一次地预加载帧。如何在C ++中完成?
- 编辑
要求的两种方法:i)loadSequence,ii)preloadAllFrames();
loadSequence(string prefix, string firstFrame, string lastFrame){
for(int i=0;i<numFrames;++i){
//adds and pushes values of all the files in the sequence to a vector
}
}
preloadAllFrames(){
for(int i=0;i<numFrames;++i){
//create pointers to image textures and store then in a vector so that it doesn't take time to load them for drawing
}
}
答案 0 :(得分:0)
在图像上有一个附带的布尔值,并在您尝试加载图像时检查图像是否已经加载。您也可以在程序初始化一次时加载它,而不是每帧都尝试加载它。
答案 1 :(得分:0)
只需要一个静态指针而不是实例,并在静态方法中初始化:
class Drawer{
private:
static std::unique_ptr<ImageSequence> imgSequence;
public:
static void initializeMethod1()
{
if( imgSequence ) return; // or throw exception
imgSequence.reset( new ImageSequence( ... ) );
...
}
static void initializeMethod2() {}
{
if( imgSequence ) return; // or throw exception
imgSequence.reset( new ImageSequence( ... ) );
...
}
static ImageSequence &getSequence()
{
if( !imgSequence ) throw std::runtime_error( "image sequence is not intialized" );
return *imgSequence;
}
};