c++私有数组访问

C++ Private Array Access

本文关键字:访问 数组 c++      更新时间:2023-10-16

我有一个类,它有一个私有的unsigned char *到数据缓冲区。数据缓冲区的长度可以是可变的,所以我使用malloc()和free()来分配保存数据所需的内存量。

我的问题是,我有另一个类需要访问这些数据。我目前这样做的方式是通过创建缓冲区的工作副本并将其传递到另一个类。也就是说,我有一个函数get_data(unsigned char * copy, int size),它将大小的字节复制到copy指定的缓冲区中。缓冲区很小(约50字节),但我必须在程序的整个过程中多次这样做。因此,我正在寻找一种方法,我可以使它更精简。

是否有一种方法,我可以传递数据缓冲区指针到任何其他类?他们能覆盖缓冲区中的数据吗?我知道我可以发送回数据缓冲区指针的const副本,但是调用者可以调用const_cast并随意修改它。也就是说,它们可以调用const_cast,然后调用buf_ptr[2] = 0xFF;

提前感谢您的帮助。我希望有一种方法,我可以只是使用指针,没有调用者破坏数据的可能性,如果他们做一些讨厌的事情。

只需提供一个const unsigned char *访问器:

const unsigned char * MyClass::get_buffer() const { return m_private_buffer; }

当然,使用缓冲区的人可能会决定const_cast并修改它,但这不是您的问题。那是他们在做一些他们知道是淘气的事情。事实上,如果你是编写所有代码的人,那么你究竟为什么要试图破坏它?

有两种处理方法:

  1. 数据使用std::shared_ptr
  2. 使用std::vector<char>作为数据

然后创建一个"getter"函数,该函数返回共享指针(在第一种情况下)或对vector的引用(在第二种情况下)。如果你不想让调用者修改数据,那么你可以让返回值为const

我宁愿只返回像paddy提到的const unsigned char *。但另一种选择是让它们访问数组中带有索引的单个元素。例如:

unsigned char get_data(size_t index) const
{
    // you can even put a bounds check in here if you want
    return m_private_buffer[index];
}

或者你可以重载operator[]

这里有两个解决方案,它们都很简单且有效:

1)只对单个数组使用经典的getter和setter方法。这样你就可以通过访问get(0), get(1)等来遍历数组。设定也是如此。问题是,它将有函数调用开销(除非它是一个内联函数?可能是非常优化的),而且您还必须对程序进行大量的重构才能使用数组。

,或者简单地

2)返回指向数组的指针。私有数据仍然可以使用指针进行修改。因此,只需返回一个指向数组的指针,然后之后的一切(设置和检索元素)都将快速而简单。

所以,如果你想让数组可以被其他函数修改,指针是最好的选择。如果不是,那么一个简单的"get"操作符,声明为内联以提高速度,如果您愿意,还可以重载[]操作符,这将很好地工作。