Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为具有私有对象作为属性的类编写移动构造函数和赋值运算符?_C++_Class_C++11_Assignment Operator_Move Constructor - Fatal编程技术网

C++ 如何为具有私有对象作为属性的类编写移动构造函数和赋值运算符?

C++ 如何为具有私有对象作为属性的类编写移动构造函数和赋值运算符?,c++,class,c++11,assignment-operator,move-constructor,C++,Class,C++11,Assignment Operator,Move Constructor,我今天学的。我阅读了,并尝试将其中的move构造函数示例应用到我的代码中 class UnicodeString { public: enum ENDIANNESS_TYPE {LITTLE_ENDIAN = 0, BIG_ENDIAN = 1} ENDIANNESS; bool REPLACE_NON_ASCII_CHARACTERS; char REPLACE_NON_ASCII_CHARACTERS_WITH;

我今天学的。我阅读了,并尝试将其中的move构造函数示例应用到我的代码中

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;
}
class-unicording
{
公众:
enum ENDIANNESS_TYPE{LITTLE_ENDIAN=0,BIG_ENDIAN=1}ENDIANNESS;
bool替换非ASCII字符;
用字符替换非ASCII字符;
浮动向量_储备_系数;
单向破坏(单向破坏和其他);
// ...
UnicodeString和operator=(UnicodeString其他);
// ...
私人:
std::矢量放大;
// ...
}
UnicodeString::UnicodeString(UnicodeString和其他)
{
此->替换非ASCII字符=其他。替换非ASCII字符;
此->将非ASCII字符替换为=其他。将非ASCII字符替换为;
该->向量保留系数=Other.VECTOR保留系数;
this->ENDIANNESS=Other.ENDIANNESS;
这个->UString=?????
}
UnicodeString&UnicodeString::operator=(UnicodeString其他)
{
标准::交换(????,???);
归还*这个;
}
但是,与该示例不同,我的类
UnicodeString
不仅仅包含一个简单的C数组。它包含一个
std::vector
对象,其元素是我编写的另一个类的实例

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


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

正确的方法是(假设您使用的是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是一个私有属性,因此不能直接从另一个对象访问它


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

正确的方法是(假设您使用的是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是一个私有属性,因此不能直接从另一个对象访问它

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

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

只要是std::vector,因为它是可移动的():

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

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

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

只要是std::vector,因为它是可移动的():

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


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

UnicodeString
s应该能够看到彼此
UString
s,而不管它们是否是私有的。访问说明符适用于其他客户。
UnicodeString
s应该能够看到其他客户
UString
s,无论这些客户是否为私有客户。访问说明符适用于其他客户。