如何公开常量数据

how to expose constant data

本文关键字:数据 常量 何公开      更新时间:2023-10-16

我正在编写单元测试用例,为此我编写了一些结构及其数组,其中包含它们的输入数据和正确的结果。数据是这样的

.

e.g 测试返回 a,b 的 sum(a,b( 我有以下代码

struct Data
{
   const int a,b,c;  
};
Data arr[] = 
{
    {1,0,1};
    (2,1,3};
}
const unsigned int getsizeofarr()
{
    return sizeof(arr)/sizeof(arr[0]);
}

我不确定这是否是以 OOPS 的说法公开数据的最佳方式。我已经制作了变量常量,但const_cast可以轻松删除它并修改数据。让我知道如何公开我的测试数据,以便它保持恒定并且也可以被测试用例访问。

提前致谢

您可以创建如下访问器方法:

class Data
{
public:
  inline int GetA() const { return a; }
  inline int GetB() const { return b; }
  inline int GetC() const { return c; }
private:
  const int a, b, c;
};

访问器方法是不更改对象状态的方法。它们只是用于通过提供额外的访问层来控制对对象内数据的访问的方法。这样,用户将无法直接访问,并且必须通过访问器方法来访问原始数据。

为了避免const_cast改变只读数据,最简单的方法是隐藏数据的内存位置,这意味着用户既不能获得引用,也不能获得指向数据的指针。这实质上意味着您只需向用户提供数据的副本。

从您的示例中,您似乎只使用 int s,因此返回副本通常很便宜。但是,想象一下,如果您的vector为 1000000 int 秒。尝试复制它将相当昂贵(想想如何制作 1000000 int s 的数组的副本(。在数据大小并非微不足道的情况下,您可能希望返回对数据的只读引用,以防止任何此类复制。

class Data
{
public:
  inline const std::array<int, 1000>& GetA() const { return a; }
  inline const std::array<int, 1000>& GetB() const { return b; }
  inline const std::array<int, 1000>& GetC() const { return c; }
private:
  const std::array<int, 1000> a, b, c;
};

所以最后,你必须做出判断。数据安全比性能更重要吗?如果是这样,请隐藏数据并仅返回数据的副本。否则,数据的大小可以忽略不计吗?如果是这样,返回引用实际上可能比简单地创建数据副本更昂贵,否则,返回只读引用。

伪代码:

If security is more important than performance
  Return a copy
Otherwise
  If size of data is of negligible size
    Return a copy
  Otherwise
    Return a read-only reference

我不确定这是否是以 OOPS 的说法公开数据的最佳方式。我已经制作了变量常量,但const_cast可以轻松删除它并修改数据。让我知道如何公开我的测试数据,以便它保持恒定并且也可以被测试用例访问。

const_cast不是为了从数据中删除 const,以便您可以修改它;那就是 UB。相反,当您需要调用未标记为 const 的 API(但不修改数据(时,它应该用于从数据中删除 const 指定符。

也就是说,考虑让客户端代码决定什么应该是 const 或不应该是 const。这将允许您更灵活地使用Data实例,并指定使用时的恒常性(更明确(。

法典:

struct Data
{
   int a,b,c; // no const here
};
const std::array<Data, 2> arr = {
    {1,0,1};
    (2,1,3};
}; // const here

另请注意:考虑至少使用 std::array:它提供了与原始数组类型相同的功能更好的接口和安全性。

通常,您不会标记结构常量的成员,但变量,您可以定义:

struct Data { 
    int a,b,c; 
}; 
const Data arr[] = { {1,0,1}, {2,1,3} };

正如其他人已经提到的,你绝对应该用 std::vector 或 std::array 替换 c 样式数组(这样你也可以摆脱 getsizeofarr (。