【问题标题】:How do I write move constructor and assignment operator for a class which has a private object as property?如何为具有私有对象作为属性的类编写移动构造函数和赋值运算符?
【发布时间】:2013-05-04 01:34:47
【问题描述】:

我今天学习了Move Constructors。我阅读了this answer,并尝试将其中的移动构造函数示例应用到我的代码中。

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

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

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

【问题讨论】:

  • UnicodeStrings 应该能够看到彼此 UStrings 无论是否是 private。访问说明符适用于其他客户。

标签: c++ class c++11 assignment-operator move-constructor


【解决方案1】:

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

只需move()std::vector,因为它是可移动的 (operator=(vector&amp;&amp;)):

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

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

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

【讨论】:

    【解决方案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 是私有属性,因此不能直接从其他对象访问。

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

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 2016-05-19
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2020-07-09
      • 2017-12-11
      相关资源
      最近更新 更多