Как мне написать этот конструктор копирования? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть модель класса:

class model
{
private:
    link_list list;
    float parameter_B1;
    float parameter_B0;
public:
    model();
    float getparameter_B1() const;
    float getparameter_B0() const;
    float predict();
    void info();
};

, и, как вы можете видеть, он имеет атрибут link_list, который:

class link_list
{
private:
    node* head;
public:

    link_list();
    link_list insertNewNode(Pair _pairs);
    Pair average();
    float parameters1(Pair _average);
    float parameters2(Pair _average, float par1);
    float error(float para1,float para2);
    ~link_list();
    link_list(const link_list& p)
    {

            /*head = new node;
            head->setpair(p.head->getpair());
            head->setnextnode(p.head->getnextnode());*/

    };
};

, и я должен вернуть объект (сам) из Моя функция insertNewNode и использование конструктора копирования для добавления новых узлов в мой список.

Я новичок в c ++, но я кое-что прочитал о необходимости определения конструктора копирования, когда у нас есть Dynami c данные, так как конструктор копирования по умолчанию копирует только адрес исходного члена данных.

но я не знаю, как написать свой конструктор копирования?

Я пробовал это:

    link_list(const link_list& p)
    {

            head = new node;
            head->setpair(p.head->getpair());
            head->setnextnode(p.head->getnextnode());

    };

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

struct Pair
{
float x;
float y;
};
class node
{
private:
    Pair _pair;
    node* next;
public:
    node() {};
    void setpair(Pair p);
    Pair getpair() const;
    node* getnextnode() const;
    void setnextnode(node* temp);
};

это конструктор модели, где я называю мой insertNewNode функционал:

model::model()
{
    char filename[300];
    cout << "enter file name(path\\filname.txt):" << endl;
    cin >> filename;
    FILE* fp;
    fp = fopen(filename, "r+");
    float x, y;
    if (fp == NULL)
    {
        cout << "Unable to open the file!" << endl;
        exit(EXIT_FAILURE);
    }
    else
    {
        while (!feof(fp))
        {
            if (fscanf(fp, "%f\t%f", &x, &y) == 2)
            {
                Pair p(x, y);
                list.insertNewNode(p);

            }
        }
    }
    Pair _average = list.average();
    parameter_B1 = list.parameters1(_average);
    parameter_B0 = list.parameters2(_average, parameter_B1);
}

, а это мой insertNewNode

link_list link_list::insertNewNode(Pair _pairs)
{
    node* temp;
    temp = new node;
    temp->getpair().set_counter();
    /*temp->setpair(_pairs);
    temp->setnextnode(head);
    head = temp;*/
    temp->setpair(_pairs);
    temp->setnextnode(NULL);
    if (head == NULL)
    {
        head = temp;
        return *this;
    }
    node* tmp = head;
    while (tmp->getnextnode() != NULL)
        tmp = tmp->getnextnode();
    tmp->setnextnode(temp);
    return *this;
}

и, наконец, это мой деструктор:

link_list::~link_list()
{
    node* current = head;
    node* next;

    while (current != NULL)
    {
        next = current->getnextnode();
        delete(current);
        current = next;
    }
    head = NULL;
}

PS: Пара - это класс, и если его включить, мой вопрос станет очень длинным. и я только хочу узнать об идее такого конструктора копирования, предполагая, что данные - это что-то, и есть класс связанного списка, который используется как атрибут другого класса.

Заранее благодарен за помощь и извините за длинный вопрос .

...