如何返回/复制unique_ptr<无符号字符[]>的值?



我有一个简单的类,C++中有一个属性std::unique_ptr<unsigned char[]>。我想要一个将字符串转换为std::unique_ptr<unsigned char[]>的函数,另一个将浮点转换为std::unique_ptr<unsigned char[]>,第三个函数返回属性std::unique_ptr<unsigned char[]>。我的标头正在编译,但源 CPP 不是。甚至返回属性也没有编译。

#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;
}

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

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

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

返回buff_中的数据视图,不要尝试复制它。

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

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

最新更新