2016-11-13 3 views
-1

Я пробовал смотреть видео и старые сообщения, но по-прежнему очень сложно понять концепцию конструкторов копирования. Кто-нибудь прояснит это для меня? Мой класс на самом деле не покрывал эту часть на 100%, мой профессор сосредоточился главным образом на конструкторах и деструкторах.Как создать и выполнить конструктор копирования для связанного списка?

Главная CPP

#include <iostream> 
#include "Header.h" 
using namespace std; 


int main() 
{ 
    node access; 

    access.getData(); 
    access.outData(); 

    system("pause"); 
    return 0; 
} 

Заголовочный файл

#include <iostream> 

using namespace std; 

class node 
{ 
public: 
    node(); // Had to create my own default constructor because of my copy constructor. 
    node(const node &n); // This is a copy constructor. 
    ~node(); 
    void getData(); 
    void outData(); 
private: 
    int num; 
    int lCount = 0; // Counts the number of nodes, increments after each user input. 
    int *ptr; // Where the linked list will be copied into 
    node *next; 
    node *first; 
    node *temp; 
    node *point; 
}; 

node::node() 
{ 
    num = 0; 
} 

node::node(const node &n) 
{ 
    temp = first; 

    ptr = new node; 
    for (int i = 0; i < lCount; i++) 
    { 
     ptr[i] = temp->num; 
     temp = temp->next; 
    } 

} 

node::~node() // Deletes the linked list. 
{ 
    while (first != NULL) 
    { 
     node *delP = first; // Creates a pointer delP pointing to the first node. 
     first = first->next; // "Removes first node from the list and declares new first. 
     delete delP; // Deletes the node that was just removed. 
    } 
    cout << "List deleted" << endl; 
} 

void node::getData() // Simple function that creates a linked list with user input. 
{ 
    int input = 0; 
    point = new node; 
    first = point; 
    temp = point; 

    while (input != -1) 
    { 
     cout << "Enter any integer, -1 to end." << endl; 
     cin >> input; 

     if (input == -1) 
     { 
      point->next = NULL; 
      break; 
     } 
     else 
     { 
      lCount++; 
      point->num = input; 
      temp = new node; 
      point->next = temp; 
      point = temp; 
     } 
    } 
} 

void node::outData() 
{ 
    temp = first; 
    cout << "Original" << endl; 
    while (temp->next != NULL) 
    { 
     cout << temp->num << endl; 
     temp = temp->next; 
    } 

    cout << "Copied" << endl; 
    for (int i = 0; i < lCount; i++) 
    { 
     cout << ptr[i] << endl; 
    } 
} 

Этот небольшой фрагмент кода является то, что у меня возникли проблемы с, в частности:

node::node(const node &n) 
{ 
    temp = first; 

    ptr = new node; 
    for (int i = 0; i < lCount; i++) 
    { 
     ptr[i] = temp->num; 
     temp = temp->next; 
    } 
} 
+0

https://www.tutorialspoint.com/cplusplus/cpp_copy_constructor.htm –

+1

Возможная дубликат [Создание конструктора копирования для связанного списка] (http://stackoverflow.com/questions/7811893/creating-a-copy-construct или-для-связанного списка) –

+0

@JasonC Я просмотрел это уже, а также предыдущие сообщения. Я просто не понимаю, глядя на чужой код. Я надеюсь, что, имея свой собственный код, чтобы посмотреть, это очистит его для меня. –

ответ

0

Я понял! Я переделывал гораздо более простой конструктор копий. У меня возникли проблемы с пониманием синтаксиса, все было очень сложно, и было ошеломляюще смотреть на него.

#include <iostream> 

using namespace std; 

class node 
{ 
public: 
    node(int x); // Normal Construtor 
    node(const node &cpy); // Copy Constructor 
    void change(); // Changes data value 
    void outData(); 
private: 
    int data; 
}; 

int main() 
{ 
    node var1(123); 
    var1.outData(); 
    node var2 = var1; 
    var2.outData(); 

    var2.change(); 
    var1.outData(); 
    var2.outData(); 

    system("pause"); 
    return 0; 
} 

node::node(int x) 
{ 
    data = x; 
} 

node::node(const node &cpy) 
{ 
    data = cpy.data; 
} 

void node::outData() 
{ 
    cout << data << endl; 
} 

void node::change() 
{ 
    int userIn; 
    cin >> userIn; 
    data = userIn; 
} 

Выход:

123 
123 

(входной сигнал: 4444)

Выход:

123 
4444 
-1

Чтобы позвонить копию конструктор все, что вам нужно сделать, это передать значение переменной этого типа данных. Чтобы создать метод с прототипом type::type(const type &old). Как вы копируете, зависит от вас. Но в целом вы хотите сделать то, что называется глубокой копией, где вы создаете все новое для новой вещи. пример:

DoubleLinkedList(const DoubleLinkedList &other) { 
    //start with empty list 
    numberNodes = 0; 
    firstNode = nullptr; 
    lastNode = nullptr; 
    //build new list- iterate over every node 
    for (auto i = other.firstNode; i; i = i->next()) { 
     //make new node for the old nodes 
     push_back(i->data()); 
    } 
} 
+0

вы сказали, что проходите по значению, но вы передаете по ссылке в коде. btw im not downvoter –

+0

«other.firstNode» из исходного списка, скопированного из правильного? –

+0

@ DannyOrangeCitrus да –