如何使用在运行时计算的大小创建GLTexture nullptrs数组? 。下面的实现创建了一个使用nullptr初始化的数组GLTexture指针,其常量大小为[11] [32]。我希望下面的头文件中显示的11和32与运行时计算的值互换。
标头文件
#pragma once
#include <GLEW\glew.h>
#include "GLTexture.h"
namespace Nova
{
class TextureBinder
{
private:
GLuint m_activeUnit;
GLint m_maxTextureUnits;
GLint m_maxTextureTargets;
GLTexture* m_boundTextures[11][32] = {nullptr};
public:
static TextureBinder& GetInstance()
{
static TextureBinder binder;
return binder;
}
TextureBinder(TextureBinder const&) = delete;
void operator=(TextureBinder&) = delete;
private:
TextureBinder();
};
}
CPP档案
#pragma once
#include "TextureBinder.h"
namespace Nova
{
/* zero is the default opengl active texture unit
- glActiveTexture(unit) only needs to be called for multitexturing
*/
TextureBinder::TextureBinder()
:
m_activeUnit(0),
m_maxTextureTargets(11)
{
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &m_maxTextureUnits);
}
}
答案 0 :(得分:2)
假设您确实需要一个动态大小的数组(即可以在运行时计算并使用不同大小),您需要在构造函数中使用循环:
GLTexture* **m_boundTextures;
TextureBinder() {
/* ... */
m_boundTextures = new GLTexture* *[HEIGHT];
for(int i = 0; i < HEIGHT; i++) {
m_boundTextures[i] = new GLTexture* [WIDTH];
for(int j = 0; j < WIDTH; j++) {
m_boundTextures[i][j] = nullptr;
}
}
/* ... */
}
当然要确保在析构函数中使用delete [](以相同的格式)清理内存。
答案 1 :(得分:1)
代码的最简单替代方法是使用:
std::vector< std::vector<GLTexture*> > m_boundTextures;
并添加到ctor-initializer列表
// Numbers can be replaced by variables,
// or you can set the size later using 'resize' member function
m_boundTextures(11, std::vector<GLTexture*>(32));
要考虑的另一个选择是使用大小为11 * 32
的单个向量(或任何尺寸),然后使用乘法来访问正确的索引;你可以为此做一个辅助函数,例如:
GLTexture* & lookup(size_t row, size_t col) { return m_boundTextures.at(col + row * row_length); }