如何在类中存储const数组

How to store const array in class?

本文关键字:存储 const 数组      更新时间:2023-10-16

我的OOP风格的C++应用程序有一个方法(在许多.cpp文件中使用),它可以获得两个参数:指向数组的指针和数组大小:

bool SendData(unsigned char* data, size_t size);

我有一些数组,永远不会改变。我想定义它们,或者做一个常量,或者其他什么,来做这件事:

bool result1, result2;
unsigned char arr2[] = {0x2, 0x5, 0x6};
result1 = SendData(PREDEFINED_ARRAY_1, sizeof(PREDEFINED_ARRAY_1));
result2 = SendData(arr2, sizeof(arr2));

我试着用常量来解决它——只需在头文件中写入:

static const unsigned char PREDEFINED_ARRAY_1[] = {0x1, 0x3, 0x5};
static const unsigned char PREDEFINED_ARRAY_1[] = {0x2, 0x3, 0x4, 0x5, 0x6, 0x7};

但是获取有关"{"answers"}"的编译器错误。这让我很困惑,因为我可以写:

static const unsigned char c = 10;

一切都会好起来的。我可以初始化变量,但不能初始化数组?这很奇怪。

是的,我知道,静态变量应该在cpp文件中初始化,但我有很多文件,它们使用这个带有常量的函数,所以,正如我所知,这是一种死办法。我显示此代码只是为了解释我想要什么。

此外,我不想在类中定义之后,在构造函数(或特殊函数)中写这样的东西

PREDEFINED_ARRAY_1[0] = 0x1;
PREDEFINED_ARRAY_1[1] = 0x3;
PREDEFINED_ARRAY_1[2] = 0x5;

因为数组的数量约为100个,每个数组的长度约为20-30个符号。简单的事情代码太多了。还是不?

然后,我尝试创建一个特殊的类:

class Array
{
public:
void Set(unsigned char symbol, ...); // using va_args
unsigned char* GetData();
size_t GetSize();
private:
unsigned char* data;
size_t size;
};
class MainClass
{
public:
MainClass();
void Send();
Array PREDEFINED_ARRAY_1;
Array PREDEFINED_ARRAY_2;
};
MainClass::MainClass()
{
PREDEFINED_ARRAY_1.Set(3, 0x1, 0x3, 0x5);
PREDEFINED_ARRAY_1.Set(6, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7);
}
void MainClass::Send()
{
SendData(PREDEFINED_ARRAY_1.GetData(), PREDEFINED_ARRAY_1.GetSize());
}

但在这种情况下,我应该手动计算符号的数量。最大长度可以是大约50个符号,并且错误的风险太高。我想避开它。

第三种也是最愚蠢的方法是这样的:

#define PREDEFINED_ARRAY_1 {0x1,0x3,0x5}
int main()
{
unsigned char arr1[] = PREDEFINED_ARRAY_1;
SendData(arr1, sizeof(arr1));
}

但是它太难看了。

我的问题是:做这件事的最佳实践是什么

第页。正如我已经说过的,我使用OOP范式,并希望避免全局变量和其他C事物。

您可以在头文件中声明数组,但要为它们提供C样式数组的完整类型信息(即长度)。然后在实现文件中定义数组内容。

然后,数组内容"活"在相应.cpp文件的翻译单元中(在您的项目中一次),但包含的每一个标头都足以正确使用sizeof

// .h
class MainClass {
public:
static const unsigned char predefinedArray1[3];
static const unsigned char predefinedArray2[5];
};
// .cpp
const unsigned char MainClass::predefinedArray1[] = { 'x', 'y', 'z' };
const unsigned char MainClass::predefinedArray2[] = { 'a', 'b', 'c', 'd', 'e' };

演示使用情况:http://ideone.com/UK0EOv