У меня есть модель класса:
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: Пара - это класс, и если его включить, мой вопрос станет очень длинным. и я только хочу узнать об идее такого конструктора копирования, предполагая, что данные - это что-то, и есть класс связанного списка, который используется как атрибут другого класса.
Заранее благодарен за помощь и извините за длинный вопрос .