Копирование / переназначение `std :: stringbuf` в C ++ - PullRequest
0 голосов
/ 11 февраля 2020

Я пишу класс, который записывает данные в терминал из сокета. Чтобы протестировать некоторые из моих методов, у меня есть метод установки для одной из моих переменных класса, которая оказывается объектом std::stringbuf. При попытке назначить новый объект экземпляру класса, мой редактор показывает ошибку в назначении. Для ясности, вот мой прототип класса:

class MainServer : BaseServer 
{
    public:
        MainServer();
        void setByteBuffer(std::stringbuf);
    private:
        int valread;
        std::stringbuf byteBuffer;
        void dataRead();
        void terminalWrite();
};

Метод, который доставляет мне неприятности, setByteBuffer, реализация:

void MainServer::setByteBuffer(std::stringbuf testByteBuffer)
{
    byteBuffer = testByteBuffer;
}

Ошибка, которую дает мне редактор is:

std::stringbuf &std::stringbuf::operator=(const std::stringbuf &)
+1 overload

@brief %Vector assignment operator.
@param __x A %vector of identical element and allocator types.

All the elements of @a __x are copied, but any unused capacity in
@a __x will not be copied.

Whether the allocator is copied depends on the allocator traits.

function "std::__cxx11::basic_stringbuf<_CharT, _Traits, _Alloc>::operator=(const std::__cxx11::basic_stringbuf<_CharT, _Traits, _Alloc> &) [with _CharT=char, _Traits=std::char_traits<char>, _Alloc=std::allocator<char>]" (declared at line 140 of "/usr/include/c++/9/sstream") cannot be referenced -- it is a deleted function

Кажется, что конструктор присваивания (то есть копирования) для класса stringbuf не подходит для того, что я пытаюсь сделать. Как можно это исправить? Я предположил, что одним из решений является использование stringbuf *, но это кажется плохой идеей, поскольку в любом случае это будет использоваться только для целей тестирования.

1 Ответ

1 голос
/ 11 февраля 2020

Самое простое решение вашей ошибки: [пример бога]

byteBuffer = std::move(testByteBuffer);

stringbuf объекты не могут быть скопированы, но они являются подвижными.

( Однако, как указал пользователь 7860670, вам может быть проще использовать что-то вроде std::vector или std::string в качестве хранилища вместо std::stringbuf. Трудно предложить идеальное решение без дополнительного контекста, чтобы помочь понять, что вы пытаетесь сделать - если вы можете заставить код работать, вы можете рассмотреть возможность публикации на CodeReview.SE для дальнейших улучшений. Независимо от того, если вы намереваетесь стать владельцем переданного объекта, его перемещение в любом случае является хорошей практикой, чтобы избежать ненужного копирования.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...