C ++类:如何在move构造函数中“重置”模板字段?

格里芬

我是一个初学者,我希望我不要因为我不懂术语而重复发表文章,但是我一直在搜寻Stack Overflow和Google,但仍然找不到我的问题的答案,或者至少没有找到答案我能理解。

我正在为单链接列表分配编写Node类。该类有两个字段:elem和next。Elem是模板化的,下一个是Node指针。

我决定编写一个自定义构造函数(以及所有其他构造函数),因此可以确定每个新Node都将next初始化为nullptr,因此不会遇到指针问题。类头:

template <typename E>
class Node {
public:

    //Constructors
    Node();
    Node( const Node<E> &other);           //copy
    Node<E>& operator=( Node<E> other );   //copy asn
    Node( Node&& other );                  //move
    Node<E>& operator=( Node<E>&& other ); //move asn
    ~Node();

    // {...Getters and setters and the like...}

private:
    E elem{};       //datatype independent element
    Node<E>* next;  //pointer to next list item
};

我的问题是编写move构造函数。据我了解,move构造函数的基本概述如下:

myClass( myClass&& otherMyClassObj ) {

    // Step 1: Steal object's resources

    myClassField = otherMyClassObj.myClassField;
    myClassOtherField = otherMyClassObj.myClassOtherField;
    /* ...etc... */

    // Step 2: Set other object to a valid but default state so it will be deleted

    otherMyClassObj.myClassField = <whatever is default for type>;
    otherMyClassObj.myClassOtherField = <whatever is default for type>;
    /*...etc...*/
}

但是,当我尝试使用该轮廓在类中编写move构造函数时,我遇到了一个问题:elem的默认状态是什么,我不知道其类型,因为它是在运行时确定的?我的代码为move构造函数:

template <typename E>
Node::Node( Node&& other ) {

    next = other.next;
    elem = other.elem;

    other.next = nullptr;
    other.elem = /* ???? */
}

我能想到的唯一解决方案是在另一个上手动调用析构函数,但这似乎草率而错误。我不能使用nullptr,因为elem不一定是指针,但是我不能使用0,因为它可能是一个。我考虑过的另一种可能性是,以某种方式直接在elem上直接调用std :: move(),但是我不确定如何精确地做到这一点,并且在move构造函数中调用move构造函数似乎是天生的错误。

对于这个问题,我将不胜感激。请勿提出非标准的图书馆建议-我很乐意使用它们,但是我的教授对我们使用的图书馆非常严格。

沃纳·亨泽(Werner Henze)

只需移动每个成员。

template <typename E>
Node::Node<E>( Node<E> && other ) : next(std::move(other.next)), elem(std::move(other.elem))
{
}

请注意,我不确定上面确切的模板语法。

遵守5的规则是一件好事,但是如果您不想在某些构造函数,赋值运算符或析构函数中做任何特别的事情,则可以考虑将它们做成= default这使事情变得更轻松,更安全。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Arduino的C ++类中的构造函数中分配字符串字段?

来自分类Dev

C#如何在字典中存储类构造函数

来自分类Dev

如何在C ++中的类构造函数中使用线程?

来自分类Dev

C#如何在字典中存储类构造函数

来自分类Dev

如何在C ++中的专用模板类中访问模板类成员字段?

来自分类Dev

如何在C ++中使用通用引用参数为模板类编写构造函数

来自分类Dev

从C ++中的私有模板类继承构造函数

来自分类Dev

在C ++中访问模板类的私有构造函数

来自分类Dev

当父类在 C++ 中没有默认构造函数时,如何在继承的类中使用构造函数?

来自分类Dev

如何在C ++中从基类构造函数调用派生类方法?

来自分类Dev

如何在C ++中显式实例化模板构造函数?

来自分类Dev

如何在C ++中调用可变参数模板构造函数?

来自分类Dev

如何在C ++中“默认构造函数”

来自分类Dev

如何在C ++中使用构造函数(只是构造函数)在类中初始化大型私有数组?

来自分类Dev

c#如何在数组类构造函数中存储多个值?

来自分类Dev

如何在C ++类中存储Embind'val'-错误:调用已删除的构造函数

来自分类Dev

如何在类的构造函数中初始化对象的2D向量?(C ++)

来自分类Dev

如何在C#中调用通过Structure Map实例化的类的构造函数

来自分类Dev

如何在C ++中为多个类类型指定相同的模板化成员函数?

来自分类Dev

如何在必须返回类模板的函数指针上使用C ++中的typedef?

来自分类Dev

如何防止C#类中的构造函数滥用

来自分类Dev

如何在C ++中的另一个模板函数中使用属于模板化类的嵌套类型?

来自分类Dev

非模板类中的C ++模板函数

来自分类Dev

隐式类构造如何在C ++中工作?

来自分类Dev

在C ++中的模板实例化中将带有构造函数的类用作类型参数

来自分类Dev

C ++中带有另一个模板类作为参数的构造函数

来自分类Dev

如何在C ++中编写默认构造函数?

来自分类Dev

如何在main()c ++中调用构造函数?

来自分类Dev

如何在C ++中对完整的类进行模板化

Related 相关文章

  1. 1

    如何在Arduino的C ++类中的构造函数中分配字符串字段?

  2. 2

    C#如何在字典中存储类构造函数

  3. 3

    如何在C ++中的类构造函数中使用线程?

  4. 4

    C#如何在字典中存储类构造函数

  5. 5

    如何在C ++中的专用模板类中访问模板类成员字段?

  6. 6

    如何在C ++中使用通用引用参数为模板类编写构造函数

  7. 7

    从C ++中的私有模板类继承构造函数

  8. 8

    在C ++中访问模板类的私有构造函数

  9. 9

    当父类在 C++ 中没有默认构造函数时,如何在继承的类中使用构造函数?

  10. 10

    如何在C ++中从基类构造函数调用派生类方法?

  11. 11

    如何在C ++中显式实例化模板构造函数?

  12. 12

    如何在C ++中调用可变参数模板构造函数?

  13. 13

    如何在C ++中“默认构造函数”

  14. 14

    如何在C ++中使用构造函数(只是构造函数)在类中初始化大型私有数组?

  15. 15

    c#如何在数组类构造函数中存储多个值?

  16. 16

    如何在C ++类中存储Embind'val'-错误:调用已删除的构造函数

  17. 17

    如何在类的构造函数中初始化对象的2D向量?(C ++)

  18. 18

    如何在C#中调用通过Structure Map实例化的类的构造函数

  19. 19

    如何在C ++中为多个类类型指定相同的模板化成员函数?

  20. 20

    如何在必须返回类模板的函数指针上使用C ++中的typedef?

  21. 21

    如何防止C#类中的构造函数滥用

  22. 22

    如何在C ++中的另一个模板函数中使用属于模板化类的嵌套类型?

  23. 23

    非模板类中的C ++模板函数

  24. 24

    隐式类构造如何在C ++中工作?

  25. 25

    在C ++中的模板实例化中将带有构造函数的类用作类型参数

  26. 26

    C ++中带有另一个模板类作为参数的构造函数

  27. 27

    如何在C ++中编写默认构造函数?

  28. 28

    如何在main()c ++中调用构造函数?

  29. 29

    如何在C ++中对完整的类进行模板化

热门标签

归档