如何在运行时设置数组大小而不构造对象?

时间:2016-03-13 20:01:55

标签: c++ arrays pointers

如何使用在运行时计算的大小创建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);
    }   
}

2 个答案:

答案 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); }