Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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+,这是一个深度复制且正确实现的=运算符吗+;链表?_C++_Class_Operator Overloading_Linked List - Fatal编程技术网

C++ 对于C+,这是一个深度复制且正确实现的=运算符吗+;链表?

C++ 对于C+,这是一个深度复制且正确实现的=运算符吗+;链表?,c++,class,operator-overloading,linked-list,C++,Class,Operator Overloading,Linked List,现在我正在尝试使用我创建的双链表类,我遇到了一些bug。我对=运算符的实现如下所示: template <typename T> Dlist<T>& Dlist<T>::operator=(const Dlist &l) { copyAll(l); return *this; } template <typename T> void Dlist<T>::copyAll(const Dlist &

现在我正在尝试使用我创建的双链表类,我遇到了一些bug。我对=运算符的实现如下所示:

template <typename T>
Dlist<T>& Dlist<T>::operator=(const Dlist &l)
{
    copyAll(l);
    return *this;
}

template <typename T>
void Dlist<T>::copyAll(const Dlist &l)
{
    node *copyList = new node;
    copyList = l.first;
    while(copyList){
        insertFront(copyList.first->o);
        copyList = copyList->next;
    }
    delete copyList;
}
模板
Dlist&Dlist::operator=(常量Dlist&l)
{
copyAll(l);
归还*这个;
}
模板
void Dlist::copyAll(常量Dlist&l)
{
节点*copyList=新节点;
copyList=l.first;
while(复制列表){
insertFront(copyList.first->o);
复制列表=复制列表->下一步;
}
删除文案;
}
请注意,o是列表中节点中数据的指针

我的目的是让copyAll成为真正的深度拷贝。不是这样吗?这里我的类方法定义有问题吗?我是链接列表的新手,非常感谢您的帮助

编辑:具体地说,我遇到的问题是,当我制作一个列表并填充它,然后制作一个新列表并将其设置为第一个列表,每当我对第二个列表做一些事情时,它也会改变第一个列表

编辑2:这是课堂本身。我不允许添加任何其他成员函数:

template <typename T>
class Dlist {
 public:

    // Operational methods

    bool isEmpty();
    // EFFECTS: returns true if list is empty, false otherwise

    void insertFront(T *o);
    // MODIFIES this
    // EFFECTS inserts o at the front of the list

    void insertBack(T *o);
    // MODIFIES this
    // EFFECTS inserts o at the back of the list

    T *removeFront();
    // MODIFIES this
    // EFFECTS removes and returns first object from non-empty list
    //         throws an instance of emptyList if empty

    T *removeBack();
    // MODIFIES this
    // EFFECTS removes and returns last object from non-empty list
    //         throws an instance of emptyList if empty

    // Maintenance methods
    Dlist();                                   // ctor
    Dlist(const Dlist &l);                     // copy ctor
    Dlist &operator=(const Dlist &l);          // assignment
    ~Dlist();                                  // dtor

 private:
    // A private type
    struct node {
    node   *next;
    node   *prev;
    T      *o;
    };

    node   *first; // The pointer to the 1st node (NULL if none)
    node   *last;  // The pointer to the 2nd node (NULL if none)


    void makeEmpty();
    // EFFECT: called by constructors/operator= to establish empty
    // list invariant

    void removeAll();
    // EFFECT: called by destructor/operator= to remove and destroy
    // all list elements

    void copyAll(const Dlist &l);
    // EFFECT: called by copy constructor/operator= to copy elements
    // from a source instance l to this instance
 };
模板
类列表{
公众:
//操作方法
bool是空的();
//效果:如果列表为空,则返回true,否则返回false
空心插件正面(T*o);
//修改这个
//效果在列表的前面插入o
空回插(T*o);
//修改这个
//效果在列表的后面插入o
T*removeFront();
//修改这个
//效果从非空列表中删除并返回第一个对象
//如果为空,则抛出emptyList的实例
T*removeBack();
//修改这个
//效果从非空列表中删除并返回最后一个对象
//如果为空,则抛出emptyList的实例
//维护方法
Dlist();//
Dlist(const Dlist&l);//复制
数据列表和运算符=(常量数据列表和运算符);//赋值
~Dlist();//dtor
私人:
//私人类型
结构节点{
节点*下一步;
节点*prev;
T*o;
};
node*first;//指向第一个节点的指针(如果没有,则为NULL)
node*last;//指向第二个节点的指针(如果没有,则为NULL)
void makeEmpty();
//效果:由构造函数/运算符调用=建立空
//列表不变量
void removeAll();
//效果:由析构函数/运算符调用=删除并销毁
//所有列表元素
无效复制所有文件(常数列表和列表);
//效果:由复制构造函数/运算符调用=复制元素
//从源实例l到此实例
};
你说的是“一些bug”。在提问时提及这些是什么是很有帮助的


也就是说,请看
copyAll
的前两行。第一行分配一个新节点,第二行覆盖该指针,永远丢失它。也许你的意思是
copyList.first=l.first
。您还需要在while循环中构造新节点。

基本上,浅拷贝和深拷贝的区别在于您是只复制指针本身还是复制指针指向的所有数据。如果您的对象是派生的,请不要忘记调用基类并复制其所有成员,以避免部分初始化

通常,您希望为此提供一个复制构造函数。赋值运算符类似于复制,但实际上是在已构造且可能已初始化的对象上完成赋值

至于你是否做得很好,这取决于你的类的实现细节,而你在这里没有展示这些细节。您所显示的内容看起来不完整


<>你可能想考虑使用<代码> STD::列表,直到你更熟悉C++和数据结构,然后尝试实现你自己的版本。如今,除了出于好奇或更全面地了解基本概念之外,很少有人真的需要重新发明轮子。

我认为代码无法编译,您将
复制列表
用作指针(->下一步)和参考(.first)。最后的删除没有意义,
copyList
在这一点上应该始终为空。它肯定会编译,但它没有做它应该做的。这是为了我的类,他们让我们实现双链接列表用于教育目的XD。否则我肯定会使用std::list!在我的帖子中添加了更多信息。我不能做copyList。首先,正如你现在可以告诉我的。然后你需要像
this->first=copyList
,就在新语句之后。在纸上逐行检查代码,看看哪些指针指向哪里。还要考虑指针应该指向哪里,您的错误和解决方案就会显而易见。