c++ - 初始化 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
在上面的代码中初始化的正确方法是什么?
解决方案
有两个问题:bmp_image
永远不会初始化,并且在读取之前删除数组。
而不是这个:
BITMAP bmp_image(BMP1);
做这个:
bmp_image = new BITMAP(BMP1);
这些指针应该在每个类的析构函数中被删除,而不是之前。
此外,您实际上并没有创建一个常量数组。您正在动态创建数组,因为您使用new
. 使其成为放置在文本部分中的编译时常量的一种方法是使用图像创建一个全局数组:
static const uint16_t BMP1[] = {0xFFFF, 0xFFFF};
然后将此数组传递给BITMAP
.
推荐阅读
- c# - 使用流进行图像解码的列表视图
- javascript - 摇动以撤消问题 ios Safari
- java - '蜂巢上的火花' - 引起:java.lang.ClassNotFoundException:org.apache.hive.spark.counter.SparkCounters
- r - ggplot 将不同的图形合二为一
- javascript - 在根和任何对象之间的对象树中查找对象
- neo4j - 如何检查节点是否全局存在并在 Cypher 中设置条件?
- storage - 存储 api 不适用于 Microsoft Edge 上的自签名扩展
- sql-server - SQL Server 命名实例 TCPIP 端口设置和端点/基础结构权限错误
- python-3.x - 当我多次运行此代码片段时,它会在 python 中生成一个随机偶数,它会打印“无”一段时间。为什么会这样?
- java - Windows 上的 Java 时钟精度:15-16ms