Я хотел бы спросить вас, как написать конструктор копирования (и operator =) для следующих классов.Конструктор копирования и динамическое распределение
Узел класса хранит координаты x, y каждого узла и указатель на другой узел.
class Node
{
private:
double x, y;
Node *n;
public:
Node (double xx, double yy, Node *nn) : x(xx), y(yy), n(nn) {}
void setNode (Node *nn) : n(nn) {}
...
};
Класс NodesList (унаследованных от станд :: вектор) хранит все динамически выделенные узлы
class NodesList : public std::vector<Node *>
{}
Основная программа:
int main()
{
Node *n1 = new Node(5,10,NULL);
Node *n2 = new Node(10,10,NULL);
Node *n3 = new Node(20,10,NULL);
n1->setNode(n2);
n2->setNode(n3);
n3->setNode(n2);
NodesList nl1;
nl1.push_back(n1);
nl1.push_back(n2);
nl1.push_back(n3);
//Copy contructor is used, how to write
NodesList nl2(nl1);
//OPerator = is used, how to write?
NodesList nl3 = nl1;
}
Я не хочу создать мелкую копию каждого узла, но глубокую копию каждого узла. Могу ли я попросить образец кода с конструктором копирования?
Каждый узел может быть направлен более одного раза. Давайте такую ситуацию, когда 3 узла п [1], п [2], п [3] сохраняются в NodesList NL1:
п [1] указывает на п [2]
п [ 2] указывает на п [3]
п [3] указывает на п [2]
А] Наш процесс конструктор копирования узел п [1]. Он создает новый объект n [1] _new, представленный копией старого объекта n [1] _old. Узел n [2] указал на n [1] _old еще не существует, поэтому n [2] _new также должно быть создано ... Указатель с n1_new на n2_new задан.
B] Затем обрабатывается вторая точка n [2]. Он не может быть создан дважды, n [2] _new было создано в A]. Но остроконечный узел n [3] не существует, поэтому создается новый объект n [3] _new как копия старого объекта n [3] _old. Установлен указатель от n2_new до n3_new.
C] Узел n [3] _new уже создан и n [2] _new. Указатель от n3_new к n2_new установлен и другой объект не будет создан ...
Так конструктор копирования должен проверить, был ли объект был создан в прошлом или не имеет ...
Некоторые подсчет ссылок может быть полезно ...
Определение 'setNode' не является законным. Только конструкторы могут иметь инициализаторы. Кроме того, линии не должны иметь одинаковый уровень отступов; отступы должны отражать уровни гнездования блоков. – outis
Вы также можете рассмотреть возможность переименования 'Node :: setNode' и' Node :: n' более описательного отношения, например, к 'Node :: setParent' и' Node :: parent' или 'Node :: setReferent' и 'Node :: referent'. Как бы там ни было, нет различия между узлом и узлом узла. – outis