我有一个简单的类,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
是一个不可复制的对象。如果需要对它的只读访问权限,则有两个(主要(选项:
-
返回对
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
在这里似乎更合适。
你不能这样做。您必须将字符串的内容复制到由唯一指针指向的新数组中,然后返回唯一指针。
另一种选择是在两个继承的类中返回一个字符串。
返回buff_
中的数据视图,不要尝试复制它。
const unsigned char * SkinnyBuffer::getBuffValue() const {
return _buff.get();
}
您可以使用该值,直到销毁或修改SkinnyBuffer
。