【问题标题】:C++ Private Array AccessC++ 私有数组访问
【发布时间】:2013-06-01 20:24:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果有人在使用 const_cast,他们面临的问题比可能修改数组中的某些值要大得多。
  • const_cast 几乎不应该使用,除非您将结果传递给不修改内容的函数。如果程序员 const_char 你的缓冲区,那么他不应该对崩溃的东西感到惊讶。除非您有安全问题,否则我会选择共享 const unsigned char *
  • 感谢您对 const_cast 的所有保证。我基本上是从代码审查/魔鬼拥护者的角度来看这个。

标签: c++ arrays private


【解决方案1】:

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

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

或者,简单地说

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

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

【讨论】:

    【解决方案2】:

    我宁愿只返回一个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】:

      有两种处理方式:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 谢谢!我就是这么想的,我只是想放心,我不应该担心 const_cast 和所有那些讨厌的东西。
        • 规则是您不必保护您的代码免受不良程序员的攻击! =)
        猜你喜欢
        • 2017-12-15
        • 2016-07-25
        • 2014-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-18
        相关资源
        最近更新 更多