首页 > 解决方案 > 初始化 const 成员的正确方法

问题描述

我正在研究图形库,目前正在优化。据我所知(如果我错了,请纠正我),在 GCC/G++ 编译器中,只读变量和常量放在 flash 的文本部分中(我正在研究基于 ARM 处理器的嵌入式系统)和这提供了一种有效的方式来保存大量数据,而不是依赖于 RAM。

因此,我需要初始化一个类中声明的 const 数组,这是我的方法:

#include <iostream>

using namespace std;

class BITMAP{
    public:
        const uint16_t *BMP; // Image for this graphic object       

        BITMAP(uint16_t *bmp) : BMP(bmp) {} // This is where I initialize the const array

};

class GFX{
    public:
        void init_bmp();
        void render();


    private:
        // Object 
        BITMAP *bmp_image;

};

void GFX::init_bmp()
{
    cout << "Setting..." << endl;
    uint16_t *BMP1 = new uint16_t[2];  
    BMP1[0] = 0xFFFF;
    BMP1[1] = 0xFFFF;
    BITMAP bmp_image(BMP1);
    cout << "done!" << endl;

    delete[] BMP1;
}

void GFX::render()
{
    for( int i=0; i<2; i++ )
    {
        cout << i << ":" << bmp_image->BMP[i] << endl;
    }
}

int main()
{
    GFX img;

    img.test();
    img.render();


    return 0;
}

每当我尝试读取BITMAP::BMP. const uint16_t *BMP在上面的代码中初始化的正确方法是什么?

标签: c++constructorconstants

解决方案


有两个问题:bmp_image永远不会初始化,并且在读取之前删除数组。

而不是这个:

BITMAP bmp_image(BMP1);

做这个:

bmp_image = new BITMAP(BMP1);

这些指针应该在每个类的析构函数中被删除,而不是之前。

此外,您实际上并没有创建一个常量数组。您正在动态创建数组,因为您使用new. 使其成为放置在文本部分中的编译时常量的一种方法是使用图像创建一个全局数组:

static const uint16_t BMP1[] = {0xFFFF, 0xFFFF};

然后将此数组传递给BITMAP.


推荐阅读