C ++专用阵列访问

时间:2013-06-05 23:56:25

标签: c++ arrays private

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

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

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

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

4 个答案:

答案 0 :(得分:2)

只需提供const unsigned char *访问者:

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

当然,使用缓冲区的人可能决定const_cast并修改它,但这不是你的问题。那是他们做的事他们知道是顽皮的。事实上,如果你是编写所有代码的人,那么为什么你会试图打破它呢?

答案 1 :(得分:0)

有两种方法可以解决这个问题:

  1. 使用std::shared_ptr获取数据。
  2. 使用std::vector<char>作为数据。
  3. 然后创建一个“getter”函数,该函数返回共享指针(在第一种情况下)或对向量的引用(在第二种情况下)。如果您不希望调用者修改数据,则可以返回值const

答案 2 :(得分:0)

我宁愿只返回提到的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[]

答案 3 :(得分:0)

这是两个解决方案,这两个解决方案都很简单并且可行:

1)只需对单个数组使用经典的getter和setter方法。因此,您通过访问get(0),get(1)等来遍历数组。并且设置的工作方式相同。问题是,它将具有函数调用开销(除非它可能是内联函数?可能相当优化)并且您还必须重新调整程序以使用该数组。

或简单地

2)有东西返回指向数组的指针。仍然可以使用指针修改私有数据。因此,只需返回指向数组的指针,然后其他所有内容(设置和检索元素)将快速而简单。

所以,如果你想让它成为可以被其他函数修改的数组,指针将是你最好的选择。如果没有,那么一个简单的“get”运算符,声明为速度内联,并且如果你有这种倾向可能会使[]运算符重载,它会很好地工作。