Сегодня я изучил конструкторы перемещения. Я прочитал этот ответ и попытался применить в нем пример конструктора перемещения к моему коду.
class UnicodeString
{
public:
enum ENDIANNESS_TYPE {LITTLE_ENDIAN = 0, BIG_ENDIAN = 1} ENDIANNESS;
bool REPLACE_NON_ASCII_CHARACTERS;
char REPLACE_NON_ASCII_CHARACTERS_WITH;
float VECTOR_RESERVE_COEFFICIENT;
UnicodeString(UnicodeString && Other);
// ...
UnicodeString & operator=(UnicodeString Other);
// ...
private:
std::vector<UnicodeChar> UString;
// ...
}
UnicodeString::UnicodeString(UnicodeString && Other)
{
this->REPLACE_NON_ASCII_CHARACTERS = Other.REPLACE_NON_ASCII_CHARACTERS;
this->REPLACE_NON_ASCII_CHARACTERS_WITH = Other.REPLACE_NON_ASCII_CHARACTERS_WITH;
this->VECTOR_RESERVE_COEFFICIENT = Other.VECTOR_RESERVE_COEFFICIENT;
this->ENDIANNESS = Other.ENDIANNESS;
this->UString = ?????
}
UnicodeString & UnicodeString::operator=(UnicodeString Other)
{
std::swap(?????, ?????);
return *this;
}
Однако, в отличие от этого примера, мой класс UnicodeString
содержит не просто простой массив C. Он содержит объект std::vector<>
, элементы которого являются экземплярами другого класса, который я написал.
Прежде всего, в конструкторе перемещения, как мне украсть вектор UString
другого объекта, переданного R-Value?
Во-вторых, в операторе присваивания, как мне эффективно поменять местами ссылки UString
s основного объекта UnicodeString
и переданного R-Value? Обратите внимание, что .UString
является частным свойством, поэтому к нему нельзя получить прямой доступ из другого объекта
UnicodeString
должны иметь возможность видеть друг другаUString
, независимо от того,private
они или нет. Спецификатор доступа применяется к другим клиентам. - person Benjamin Bannier   schedule 09.05.2013