【问题标题】:How to store const array in class?如何在类中存储 const 数组?
【发布时间】:2014-01-09 11:28:05
【问题描述】:

我的 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};

但是得到关于“{”和“}”的编译器错误。这让我很困惑,因为我会写:

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 语言。

【问题讨论】:

  • 什么编译器错误?
  • @JohnDibling,C2059(语法错误:'{')和 C2334('{' 之前的意外标记;跳过明显的函数体)。
  • 你应该让 SendData 接受 const 数据或使数组非 const... 否则你有 constness 问题。
  • @leemes 我说的是这个案例:ideone.com/Kxs7To

标签: c++ arrays class oop constants


【解决方案1】:

您可以在头文件中声明数组,但为它们提供 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

【讨论】:

  • 谢谢。但这意味着,我应该手动计算数组中的符号数量?而且有没有办法避免呢?因为如果我写错了array[4],但是array只有3个符号,那么它编译得很好,但是在运行时我会遇到问题。
  • 嗯,不,它不应该编译:ideone.com/EpMrON(声明为 5,分配为 6)
  • 哦,但是如果你分配的 less 比声明的要少,it compiles indeed... 让我想想
  • Same problem 和(更好的)std::array 如果你有 C++11 就可以使用。仍在思考如何避免这种情况...
  • 是的,手动计数是我们真正应该解决的问题。请尝试this one,请尝试使用多个翻译单元。这就是有趣的地方。
猜你喜欢
  • 2019-06-23
  • 1970-01-01
  • 2020-02-18
  • 2019-10-30
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
相关资源
最近更新 更多