0

我今天学习了移动构造函数。我阅读了这个答案,并尝试将其中的移动构造函数示例应用到我的代码中。

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<>对象,其元素是我编写的另一个类的实例。

首先,在move构造函数中,如何窃取UStringR-Value传递的另一个对象的向量?

其次,在赋值运算符中,如何有效地交换UStringUnicodeString对象的引用和 R-Value 传递的引用?请注意,这UString是一个私有属性,因此不能直接从另一个对象访问

4

2 回答 2

3

首先,在move构造函数中,如何窃取R-Value传递的另一个对象的UString向量?

就像它是可移动move()std::vector一样(operator=(vector&&)):

this->UString = std::move(Other.UString);

其次,在赋值运算符中,如何有效地交换主 UnicodeString 对象的 UString 引用和 R-Value 传递的引用?请注意,UString 是一个私有属性,因此不能直接从另一个对象访问它。

请注意,这private适用于class,而不适用于 的实例class。这意味着相同的其他实例class可以访问private另一个实例的成员。所以,就像std::move(Other.UString)以前一样使用。

于 2013-05-09T14:29:19.527 回答
2

执行此操作的正确方法(假设您使用的是 Visual Studio,因此您的编译器不会为您执行此操作)是这样的,带有一个初始化列表:

Unicode::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(std::move(other.UString))
{
}

请注意,UString 是一个私有属性,因此不能直接从另一个对象访问它。

谁说的?私有意味着对象外部的代码无法访问它。但是一个对象实例肯定可以访问另一个对象实例的私有信息。

于 2013-05-09T14:29:02.947 回答