如何公开常量数据
how to expose constant data
我正在编写单元测试用例,为此我编写了一些结构及其数组,其中包含它们的输入数据和正确的结果。数据是这样的
.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
(。
- 在cuda线程之间共享大量常量数据
- 如何使用数据对象上的常量指针初始化类
- 从'size_t'转换为"常量双倍",可能会丢失数据
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 将收到的 usart uint8_t* 数据与常量字符串进行比较
- 检查输入 std::array 指针数据是否等于某个常量数组
- 从 Typedef 数据类型中删除常量
- 关于静态常量数据模因的声明和定义的混淆
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- C++中的常量对象或私有/常量数据成员(变量)?
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- 如何强制实施有关指针数据成员的常量正确性
- 委派复制构造函数和常量数据初始化
- 现在允许重新定义 constexpr 静态数据成员吗?(但不是内联常量)?
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- 我应该使用类内发起器初始化静态常量数据成员还是在其类外的定义中初始化静态常量数据成员
- 如何在忽略 null 的同时将数据从 char [] 复制到常量字符 *
- C++中的数据类型相当于 vb6 中的常量货币
- 常量正确清洗 Pod(普通旧数据)
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”