Как вернуть / скопировать значения unique_ptr? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть простой класс с одним атрибутом std::unique_ptr<unsigned char[]> в C ++.Я хочу иметь функцию, которая преобразует строку в std::unique_ptr<unsigned char[]>, другую для преобразования числа с плавающей запятой в 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 голосов
/ 10 октября 2018

std::unique_ptr - это не копируемый объект.Если вам нужен доступ только для чтения, у вас есть два (основных) варианта:

  1. Вернуть ссылку на unique_ptr:

    const std::unique_ptr<unsigned char[]>& getBuffValue() const
    {
        return _buff;
    }
    
  2. Вернуть постоянный указатель на управляемый массив:

    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 здесь более уместно.

0 голосов
/ 10 октября 2018

Возвращает просмотр данных в buff_, не пытайтесь их скопировать.

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

Вы можете использовать это значение, пока SkinnyBuffer не будет уничтожено илимодифицировано.

0 голосов
/ 10 октября 2018

Вы не можете сделать это таким образом.Вы должны скопировать содержимое строки в новый массив, на который указывает уникальный указатель, а затем вернуть уникальный указатель.

Другой вариант - вернуть строку в ваших двух унаследованных классах.

...