如何 return/copy unique_ptr<unsigned char[]> 的值?
How to return/copy values of an unique_ptr<unsigned char[]>?
我有一个简单的 class,在 C++ 中只有一个属性 std::unique_ptr<unsigned char[]>
。我想要一个将字符串转换为 std::unique_ptr<unsigned char[]>
的函数,另一个将 float 转换为 std::unique_ptr<unsigned char[]>
,第三个函数将属性 std::unique_ptr<unsigned char[]>
转换为 return。我的 header 正在编译,但源 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;
}
你不能这样做。您必须将字符串的内容复制到由唯一指针指向的新数组中,然后 return 唯一指针。
另一种选择是return一个字符串中你的两个继承类。
std::unique_ptr
是不可复制的对象。如果您需要对其进行只读访问,您有两个(主要)选项:
Return 对 unique_ptr
本身的引用:
const std::unique_ptr<unsigned char[]>& getBuffValue() const
{
return _buff;
}
Return 指向托管数组的 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
在这里似乎更合适。
Return查看buff_
中的数据,请勿尝试复制。
const unsigned char * SkinnyBuffer::getBuffValue() const {
return _buff.get();
}
您可以使用该值,直到 SkinnyBuffer
被销毁或修改。
我有一个简单的 class,在 C++ 中只有一个属性 std::unique_ptr<unsigned char[]>
。我想要一个将字符串转换为 std::unique_ptr<unsigned char[]>
的函数,另一个将 float 转换为 std::unique_ptr<unsigned char[]>
,第三个函数将属性 std::unique_ptr<unsigned char[]>
转换为 return。我的 header 正在编译,但源 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;
}
你不能这样做。您必须将字符串的内容复制到由唯一指针指向的新数组中,然后 return 唯一指针。
另一种选择是return一个字符串中你的两个继承类。
std::unique_ptr
是不可复制的对象。如果您需要对其进行只读访问,您有两个(主要)选项:
Return 对
unique_ptr
本身的引用:const std::unique_ptr<unsigned char[]>& getBuffValue() const { return _buff; }
Return 指向托管数组的 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
在这里似乎更合适。
Return查看buff_
中的数据,请勿尝试复制。
const unsigned char * SkinnyBuffer::getBuffValue() const {
return _buff.get();
}
您可以使用该值,直到 SkinnyBuffer
被销毁或修改。