在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;
}
答案 0 :(得分:2)
std::unique_ptr
是不可复制的对象。如果您需要对其进行只读访问,则有两个(主要)选项:
返回对unique_ptr
本身的引用:
const std::unique_ptr<unsigned char[]>& getBuffValue() const
{
return _buff;
}
返回一个指向托管数组的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
被销毁或修改为止。