C++ C++;专用阵列访问

C++ C++;专用阵列访问,c++,arrays,private,C++,Arrays,Private,我有一个类,它有一个到数据缓冲区的私有无符号字符*。数据缓冲区的长度可以是可变的,因此我使用malloc()和free()来分配保存数据所需的内存量 我的问题是我有另一个类需要访问这些数据。我目前这样做的方式是创建缓冲区的工作副本并将其传递到另一个类中。也就是说,我有一个函数get_data(unsigned char*copy,int size),它将大小字节复制到copy指定的缓冲区中。缓冲区很小(约50字节),但我必须在整个程序过程中经常这样做。因此,我正在寻找一种方法,使其更加精简 是否

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

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

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


提前谢谢你的帮助。我希望有一种方法可以直接使用指针,而不让调用者在他们做坏事时破坏数据。

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

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

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

有两种方法来处理这个问题:

  • 为数据使用一个
  • 对数据使用
    std::vector

  • 然后创建一个“getter”函数,返回共享指针(在第一种情况下)或向量引用(在第二种情况下)。如果您不希望调用者修改数据,那么可以使用返回值
    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];
    }
    

    或者,您可以为此重载
    操作符[]

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

    1) 只需对单个数组使用经典的getter和setter方法。因此,您可以通过访问get(0)、get(1)等来迭代数组,设置的工作方式也是一样的。问题是,它将有函数调用开销(除非它可能是一个内联函数?可能是非常优化的),而且您还必须为使用数组而对程序进行大量重组

    或者,简单地说

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


    所以,如果你想让数组可以被其他函数修改,指针将是你最好的选择。如果不是,那么一个简单的“get”操作符(声明为inline表示速度)将很好地工作,如果您愿意的话,还可能重载[]操作符

    如果有人正在使用const_cast,那么他们会遇到比修改数组中某些值更大的问题。除非将结果传递给不修改内容的函数,否则几乎不应使用const_cast。如果程序员const_char您的缓冲区,那么他不应该对某些崩溃感到惊讶。除非您有安全顾虑,否则我会选择共享一个const unsigned char*感谢您对const_cast的所有保证。我基本上是从代码审查/魔鬼代言人的角度来看这个问题的。谢谢!这就是我所想的,我只是想得到保证,我不必担心const_cast和所有那些nast的东西。规则是,你不必保护你的代码不受坏程序员的影响!=)