0

今日はMove Constructorsを学びました。この回答を読み、その中の移動コンストラクターの例を自分のコードに適用しようとしました。

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 コンストラクターで、R-Value で渡された他のオブジェクトのベクターを盗むにはどうすればよいでしょうか。UString

次に、代入演算子でUString、メインUnicodeStringオブジェクトの s の参照と R-Value によって渡される参照を効率的に交換するにはどうすればよいですか? はプライベート プロパティであるため、別のオブジェクトから直接アクセスできないことに注意してくださいUString

4

2 に答える 2

3

まず、move コンストラクターで、R-Value で渡された他のオブジェクトの UString ベクターを盗むにはどうすればよいでしょうか?

そのまま可動 ( move()) :std::vectoroperator=(vector&&)

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

次に、代入演算子で、メインの UnicodeString オブジェクトと R-Value によって渡されたオブジェクトの UString の参照を効率的に交換するにはどうすればよいでしょうか? UString はプライベート プロパティであるため、別のオブジェクトから直接アクセスできないことに注意してください。

のインスタンスではなく、 にprivate適用されることに注意してください。同じの他のインスタンスが別のインスタンスのメンバーにアクセスできることを意味します。ということで、今までどおり使ってください。classclassclassprivatestd::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 はプライベート プロパティであるため、別のオブジェクトから直接アクセスできないことに注意してください。

誰が言ったのですか?プライベートとは、オブジェクトの外部のコードがアクセスできないことを意味します。ただし、1 つのオブジェクト インスタンスが別のオブジェクト インスタンスのプライベートにアクセスできることはほぼ間違いありません。

于 2013-05-09T14:29:02.947 に答える