Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 04.08.2021
Сообщений: 257

Конструктор копирования для односвязного списка в данной реализации

15.04.2024, 02:45. Показов 1836. Ответов 23
Метки нет (Все метки)

Всем привет! Поскажите, пожалуйста, как правильно реализовать конструктор копирования класса MyStack2, при такой реализации конструктора с параметрами класса Node.

Node.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<typename T> class Node {
    Node<T>* pNext;
    T m_Data;
    Node():pNext(nullptr),m_Data() {
    }//default
 
    Node(Node* p_other, const T& data) :m_Data(data) {//Конструктор с параметрами
        this->pNext = p_other->pNext;
        p_other->pNext = this;
    }
    template <typename T> friend class MyStack2;
    template<typename T> friend std::ostream& operator<<(std::ostream& os, const MyStack2<T>& stack);
    template <typename T1> friend std::ostream& operator<<(std::ostream& os, const Node<T1>& node);
};
 
template <typename T1> std::ostream& operator<<(std::ostream& os, const Node<T1>& node) {
    os << node.m_Data << endl;
    return os;
}
MyString.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
#include <iostream>
#include  <ctype.h>
using namespace::std;
 
 
class MyString {
    char* str;
    void Swap(MyString&);
public:
    MyString();
    MyString(const char*);
    MyString(MyString&&);
    MyString(const MyString&);
    ~MyString();
    MyString& operator=(const MyString&);
    bool operator==(const MyString&) const;
    bool operator==(const char* key) const;
    friend ostream& operator<<(ostream&, const MyString&);
 
};
MyString.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#define _CRT_SECURE_NO_WARNINGS
#include "MyString.h"
#include <iostream>
#include <cstring>
#include <cstdarg>
 
MyString::MyString(){//Default конструктор
    str = nullptr;
}
 
MyString::MyString(const char* string) {//Конструктор с параметрами
    str = new char [strlen(string) + 1];
    strcpy(str, string);
}
 
MyString::MyString(const MyString& other) {//Конструктор Копирования
    if (this != nullptr) {
        str = new char[strlen(other.str) + 1];
        strcpy(str, other.str);
    }
    else {
        str = nullptr;
    }
}
 
MyString::MyString(MyString&& other) { //move KK
    str = other.str;
    other.str = nullptr;
}
 
 
MyString::~MyString() {//Деструктор
    if (str != nullptr) {
        delete[] str;
        str = nullptr;
    }
}
 
 
MyString& MyString::operator=(const MyString& other) { //operator=
    if (other.str != nullptr) {
        str = new char[strlen(other.str)+1];
        strcpy(str, other.str);
    }
    return *this;
}
 
bool MyString::operator==(const MyString& other) const{
    return strcmp(str, other.str) == 0;
}
 
bool MyString::operator==(const char* key) const  {
    return strcmp(str, key) == 0;
}
 
ostream& operator<<(std::ostream& os, const MyString& string) { //функция вывода на экран
    if (string.str != nullptr) {
        os << string.str;
    }
    return os;
}
MyStack.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
template<typename T > class MyStack2 {
    Node<T> Head;
    size_t size;
 
public:
        MyStack2():size(0), Head() {}
 
        void push(const T& other) {
        new Node<T>(&Head, other);
        size++;
        }
 
        T pop() {
            
            if (size == 0) { throw "EMPTY STACK"; }
                T ret = std::move(Head.pNext->m_Data);
                Node<T>* tmp = Head.pNext->pNext;
                delete Head.pNext;
                Head.pNext = tmp;
                size--;
                return ret;
        };
 
        MyStack2(const MyStack2<T>& other):size(other.size) { //Конструктор копирования?????
            Node<T>* p_other = other.Head.pNext;
            Node<T>* p_this = &Head;
            while(p_other->pNext != nullptr) {
                new Node<T>(p_other, p_other->m_Data);
                p_other = p_other->pNext;
            }
        }
 
        template<typename T> friend std::ostream& operator<<(std::ostream& os, const MyStack2<T>& stack);
};
    
template<typename T> std::ostream& operator<<(std::ostream& os, const MyStack2<T>& stack) {
    Node<T>* p = stack.Head.pNext;
    for (size_t i = 0; i < stack.size; i++) {
        std::cout << *p;
        p = p->pNext;
    }
    return os;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2024, 02:45
Ответы с готовыми решениями:

Конструктор копирования для односвязного списка
Запутался уже, подскажите пожалуйста что я делаю не так в конструкторе копирования. файл list.h #ifndef LIST_H #define LIST_H ...

Конструктор копирования для односвязного списка
Не выполняется кнструктор копирования, в строке temp2=temp копирование то происходоит, но на один адрес, а в конструкторе, если правильно,...

Копирующий конструктор для односвязного списка
Здарова ребята.Написал свой класс односвязного списка, осталась только дописать копирующий конструктор и копирование с оператором...

23
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.04.2024, 14:33
И для теста можно взять оберточку отюсда, что бы подсчитывать/смотреть что творится во время копированияя, переещения.
Где можно протестировать алгоритм сортировки?

Вот такая "оптимизация" получилась, нужно тестировать с разными списками по количеству элементов, равно, меньше, больше, пустой слева, пустой справа, оба пустых.
Ну и сборщик статистики в качестве элемента списка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 // ну и оператор присваивания копированием
    MyStack2<T> &operator=(const MyStack2<T>& other){
        if (this != &other){
            Node<T>* left = &Head;
            const Node<T>* right = &other.Head;
            // первый цикл : копирование
            while(left->pNext && right->pNext){
                left->pNext->m_Data = right->pNext->m_Data;
                left = left->pNext;
                right = right->pNext;
            }
            // ворой циикл : создание
            while(right->pNext){
                left->pNext = new Node<T>(left, right->pNext->m_Data); // забиваем на то что твоиртся в конструкторе
                left->pNext->pNext = nullptr; // заглушка
                left = left->pNext;
                right = right->pNext;
            }
            // третий : удаление
            Node<T>* del_left = left->pNext, *pnext;
            left->pNext = nullptr; // отсекаем хвост
            while(del_left){
                pnext = del_left->pNext;
                delete del_left;
                del_left = pnext;
            }  
        }
        return *this;
    }
agent070,
Справишься ?

Добавлено через 5 минут
Цитата Сообщение от agent070 Посмотреть сообщение
Я вот тут подумал, исходя из этого конструктора pNext никогда не бывает nullptr, так?
Почему же ?
Можно его установить в nullptr, вручную, как я делаю в коде выше.
Или воспользоваться конструктором по умолчанию, который и создает заглушку из nullptr.
Всё что я пишу относится к коду от lemegeton, Конструктор копирования для односвязного списка в данной реализации
И код присваивания копированием тоже на его основе.

Добавлено через 3 минуты
Ах да, я забыл про size

Добавлено через 1 минуту
Что бы на первый раз вам не забивать голову, я не принимал во вниимание критические ошибки при копировании/создании/удалении, если интерисует, это можем обсудить отдельно, после того как весь класс будет готов и работоспособен.
То есть, на данный момент, он, оператор присваивания копированием, в таком виде, не безопасен.

Добавлено через 2 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ах да, я забыл про size
C++
1
2
        this->size = other.size; // ожидаем что всё выше прошло успешно.
        return *this;
Добавляем одну строчку в оператор= перед возвратом.
1
0 / 0 / 0
Регистрация: 04.08.2021
Сообщений: 257
16.04.2024, 14:41  [ТС]
Спасибо! Буду дома попробую. А почему в первом цикле условие «И»? А если один из списков короче другого, мы не полезем в неинициализированную память?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.04.2024, 14:52
Цитата Сообщение от agent070 Посмотреть сообщение
А если один из списков короче другого, мы не полезем в неинициализированную память?
Да, для этих случая есть два других цикла.

Добавлено через 6 минут
При быстрой тестировки, всё выглядит рабочим, ну по выводу, по меньшей мере.

Добавлено через 3 минуты
Code
1
2
3
4
5
6
7
main.cpp:129:23: warning: moving a temporary object prevents copy elision [-Wpessimizing-move]
    MyStack2<int> x = std::move(copy(b));
                      ^
main.cpp:129:23: note: remove std::move call here
    MyStack2<int> x = std::move(copy(b));
                      ^~~~~~~~~~       ~
1 warning generated.
Ну а это скорее вопрос к lemegeton, что это за чудеса на виражах ))
1
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
16.04.2024, 17:18
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ну а это скорее вопрос к lemegeton, что это за чудеса на виражах ))
Грязный хак для того, чтобы избежать copy-elision и проверить как работают конструкторы/операторы.
Возможно, можно как-то проще, но я не знаю, как. В бою применять бессмысленно, ессессенно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.04.2024, 17:18

Разработать шаблон класса для реализации односвязного списка
Помогите пожалуйста разработать шаблон класса для реализации односвязного списка.

Написать копирующий конструктор для односвязного динамического списка
Помогите пожалуйста написать копирующий конструктор для этого класса #include&lt;iostream&gt; using namespace std; struct Element ...

Спроектировать шаблон класса spisok для реализации односвязного линейного списка. Не работает сортировка
Здравствуйте! Очень нужна помощь в реализации программы. Задание: Спроектировать шаблон класса spisok для реализации односвязного...

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

Фигурные скобки в реализации односвязного списка
Добрый день! В одном пособии увидел следующий код: #include &lt;stdio.h&gt; typedef struct Node Node; struct Node { int data; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru