0

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

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

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

在此先感谢您的帮助。我希望有一种方法可以让我使用指针,而不需要调用者在他们做一些讨厌的事情时破坏数据。

4

4 回答 4

2

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

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

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

于 2013-06-06T00:02:50.853 回答
0

有两种处理方法:

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

然后创建一个“getter”函数,它返回共享指针(在第一种情况下)或对向量的引用(在第二种情况下)。如果您不希望调用者修改数据,那么您可以设置返回值const

于 2013-06-06T00:06:10.223 回答
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[]或者你可以为此超载。

于 2013-06-06T00:09:02.293 回答
0

这里有两个解决方案,它们都很简单并且可以工作:

1) 只需对单个数组使用经典的 getter 和 setter 方法。这样您就可以通过访问 get(0)、get(1) 等来遍历数组。设置的工作方式相同。问题是,它会有函数调用开销(除非它可能是一个内联函数?可能会非常优化),而且你必须大量重组你的程序以使用数组。

或者,简单地说

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

所以,如果你想让数组可以被其他函数修改,指针将是你最好的选择。如果不是,那么一个简单的“get”运算符,为了速度而声明为内联,如果你愿意的话,可能会重载 [] 运算符,会很好地工作。

于 2013-06-06T00:21:15.947 回答