代码之家  ›  专栏  ›  技术社区  ›  Felipe

如何返回/复制唯一的ptr<unsigned char[]>的值?

  •  0
  • Felipe  · 技术社区  · 6 年前

    我有一个简单的类,有一个属性 std::unique_ptr<unsigned char[]> std::unique_ptr<无符号字符[]> ,将浮点转换为 std::unique_ptr<无符号字符[]> ,并返回第三个属性 . 我的头正在编译,但源CPP不是。甚至return属性也没有编译。

    #include <memory>
    class SkinnyBuffer {
    private:
        std::unique_ptr<unsigned char[]> _buff;
    public:
        ~SkinnyBuffer();
        SkinnyBuffer();
        void setBuffValue(float f);
        void setBuffValue(std::string str);
        std::unique_ptr<unsigned char[]>* getBuffValue();
    };
    
    #include "utils/SkinnyBuffer.h"
    SkinnyBuffer::~SkinnyBuffer() { }
    SkinnyBuffer::SkinnyBuffer() { }
    void SkinnyBuffer::setBuffValue(float f) {
        // How to implement it
        _buff = f;
    }
    void SkinnyBuffer::setBuffValue(std::string str) {
        _buff = std::unique_ptr<unsigned char[]>(str.data(), str.data() + str.length());
    }
    std::unique_ptr<unsigned char[]>* SkinnyBuffer::getBuffValue() {
        return &_buff;
    }
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Evg    6 年前

    std::unique_ptr 是不可复制的对象。如果需要对其进行只读访问,则有两个(主)选项:

    1. unique_ptr 本身:

      const std::unique_ptr<unsigned char[]>& getBuffValue() const
      {
          return _buff;
      }
      
    2. 返回指向托管数组的常量指针:

      const unsigned char* getBuffValue() const
      {
          return _buff.get();
      }
      

    要将字符串分配给缓冲区,可以执行以下操作:

    void setBuffValue(const std::string& str)
    {
        _buff = std::make_unique<unsigned char []>(str.length() + 1);
        std::copy_n(str.c_str(), str.length() + 1, _buff.get());
    }
    

    注意,必须将终止的空字符复制到缓冲区中。否则它对外界几乎毫无用处,因为它的长度不会为用户所知。

    std::unique_ptr<unsigned char[]> std::vector 在这里似乎更合适。

        2
  •  0
  •   Matthieu Brucher    6 年前

    你不能这样做。必须将字符串的内容复制到由唯一指针指向的新数组中,然后返回唯一指针。

    另一个选项是在两个继承的类中返回一个字符串。

        3
  •  0
  •   Caleth    6 年前

    返回a 看法 buff_ ,不要试图复制它。

    const unsigned char * SkinnyBuffer::getBuffValue() const {
        return _buff.get();
    }
    

    你可以使用这个值直到 SkinnyBuffer 被破坏或修改。