如何返回/复制unique_ptr <unsigned char [] =“”>的值?

时间:2018-10-10 11:42:58

标签: c++ unique-ptr

在C ++中,我有一个带有一个属性std::unique_ptr<unsigned char[]>的简单类。我想要一个将字符串转换为std::unique_ptr<unsigned char[]>的函数,另一个将float转换为std::unique_ptr<unsigned char[]>的函数,第三个返回属性std::unique_ptr<unsigned char[]>的函数。我的头文件正在编译,但源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 个答案:

答案 0 :(得分:2)

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

  1. 返回对unique_ptr本身的引用:

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

    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似乎更合适。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

返回buff_中数据的视图,请勿尝试复制。

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

您可以使用该值,直到SkinnyBuffer被销毁或修改为止。